diff --git a/.ahoy/site/build.ahoy.yml b/.ahoy/site/build.ahoy.yml index ee22b02fb..61c6e830a 100644 --- a/.ahoy/site/build.ahoy.yml +++ b/.ahoy/site/build.ahoy.yml @@ -34,22 +34,19 @@ commands: remake: usage: Rebuild all the dkan projects from the build.make file. cmd: | - set -e - AHOY_CMD_PROXY='' DIRNAME=${PWD##*/} # IF this is dkan_starter if [[ "$DIRNAME" == "dkan_starter" ]]; then # Building in a new directory # drush make is stupid, delete docroot_new just in case - rm -rf docroot_new + ahoy cmd-proxy rm -rf docroot_new ahoy drush -y make build.make --no-recursion --no-cache --verbose docroot_new - rm -rf docroot - mv docroot_new docroot + ahoy cmd-proxy rm -rf docroot + ahoy cmd-proxy mv docroot_new docroot # Move dkan folder from docroot/profiles to base folder - mv dkan dkan_old - mv docroot/profiles/dkan ./ - ln -s ../../dkan docroot/profiles/dkan - rm -rf dkan_old + ahoy cmd-proxy mv "dkan dkan_old; mv docroot/profiles/dkan ./" + ahoy cmd-proxy ln "-s ../../dkan docroot/profiles/dkan" + ahoy cmd-proxy rm "-rf dkan_old" # No recursive prevents dkan build to happen. Run it now from dkan remake. ahoy dkan remake fi @@ -125,35 +122,35 @@ commands: usage: Runs (what used to be buildmanager) post build commands. cmd: | # Setup a folder for contrib modules and themes. - mkdir -p docroot/sites/all/modules/contrib - mkdir -p docroot/sites/all/themes/contrib + ahoy cmd-proxy "mkdir -p docroot/sites/all/modules/contrib" + ahoy cmd-proxy "mkdir -p docroot/sites/all/themes/contrib" # Replace the default .htaccess file with our own that includes a working non-www to www example for acquia. if [ -f config/.htaccess ]; then - rm -rf docroot/.htaccess - ln -s ../config/.htaccess docroot/.htaccess + ahoy cmd-proxy "rm -rf docroot/.htaccess" + ahoy cmd-proxy "ln -s ../config/.htaccess docroot/.htaccess" fi # Replace sites/default with our own sites/default outside of the drupal root. - rm -rf docroot/sites/default; - ln -s ../../assets/sites/default docroot/sites/default + ahoy cmd-proxy "rm -rf docroot/sites/default;" + ahoy cmd-proxy "ln -s ../../assets/sites/default docroot/sites/default" # Add .htaccess to the files directory if it does not exist. if [ ! -f docroot/sites/default/files/.htaccess ]; then - ln -s ../../config/files/.htaccess docroot/sites/default/files/.htaccess + ahoy cmd-proxy "ln -s ../../config/files/.htaccess docroot/sites/default/files/.htaccess" fi # Clean out any .gitignore files imported from other modules, libraries, and profiles. - find dkan -type f -name .gitignore -exec rm -rf {} \; - find dkan -type d -name .git -exec rm -rf {} \; - find docroot/sites/all -type f -name .gitignore -exec rm -rf {} \; - find docroot/sites/all -type d -name .git -exec rm -rf {} \; + ahoy cmd-proxy "find dkan -type f -name .gitignore -exec rm -rf {} \;" + ahoy cmd-proxy "find dkan -type d -name .git -exec rm -rf {} \;" + ahoy cmd-proxy "find docroot/sites/all -type f -name .gitignore -exec rm -rf {} \;" + ahoy cmd-proxy "find docroot/sites/all -type d -name .git -exec rm -rf {} \;" # Setup custom modules folder outside of the drupal root. - rm -rf docroot/sites/all/modules/custom - rm -rf docroot/sites/all/modules/data_config - ln -s ../../../../assets/modules/data_config docroot/sites/all/modules/data_config - ln -s ../../../../config/modules/custom docroot/sites/all/modules/custom - ln -s ../../../../config/themes/custom docroot/sites/all/themes/custom + ahoy cmd-proxy "rm -rf docroot/sites/all/modules/custom" + ahoy cmd-proxy "rm -rf docroot/sites/all/modules/data_config" + ahoy cmd-proxy "ln -s ../../../../assets/modules/data_config docroot/sites/all/modules/data_config" + ahoy cmd-proxy "ln -s ../../../../config/modules/custom docroot/sites/all/modules/custom" + ahoy cmd-proxy "ln -s ../../../../config/themes/custom docroot/sites/all/themes/custom" # Remove README/INSTALL files for security reasons CIVIC-3122 - find ./docroot -type f -name "README*" -exec rm -f {} \; - find ./docroot -type f -name "INSTALL*" -exec rm -f {} \; - find ./docroot -type f -name "CHANGELOG*" -exec rm -rf {} \; + ahoy cmd-proxy find ./docroot -type f -name "README*" -exec rm -f {} \; + ahoy cmd-proxy find ./docroot -type f -name "INSTALL*" -exec rm -f {} \; + ahoy cmd-proxy find ./docroot -type f -name "CHANGELOG*" -exec rm -rf {} \; if [ "$(ahoy custom | grep post-build)" != '' ] then ahoy custom post-build diff --git a/build-dkan.make b/build-dkan.make index 9004b3fb7..843604c24 100644 --- a/build-dkan.make +++ b/build-dkan.make @@ -8,4 +8,4 @@ projects: download: type: git url: https://github.com/GetDKAN/dkan.git - tag: 7.x-1.14.5 + tag: 7.x-1.15 diff --git a/config/tests/behat.custom.yml b/config/tests/behat.custom.yml index 313666f96..83fc6c5dc 100644 --- a/config/tests/behat.custom.yml +++ b/config/tests/behat.custom.yml @@ -1,10 +1,10 @@ ---- -default: - suites: - custom: - paths: - - '%paths.base%/../config/tests/features' - contexts: +--- +default: + suites: + custom: + paths: + - "%paths.base%/../config/tests/features" + contexts: - CustomContext - FeatureContext - Drupal\DrupalExtension\Context\MinkContext diff --git a/config/themes/custom/custom b/config/themes/custom/custom new file mode 120000 index 000000000..4093a9325 --- /dev/null +++ b/config/themes/custom/custom @@ -0,0 +1 @@ +../../../../config/themes/custom \ No newline at end of file diff --git a/dkan/.ahoy/.docker/etc/solr/3.x/elevate.xml b/dkan/.ahoy/.docker/etc/solr/3.x/elevate.xml index 71ea0006c..fee52353c 100644 --- a/dkan/.ahoy/.docker/etc/solr/3.x/elevate.xml +++ b/dkan/.ahoy/.docker/etc/solr/3.x/elevate.xml @@ -15,7 +15,7 @@ Otherwise, place it with the other configuration files into the conf/ directory. - See http://wiki.apache.org/solr/QueryElevationComponent for more information. + See https://wiki.apache.org/solr/QueryElevationComponent for more information. --> diff --git a/dkan/.ahoy/.docker/etc/solr/3.x/schema.xml b/dkan/.ahoy/.docker/etc/solr/3.x/schema.xml index 97077af49..885ddaecc 100644 --- a/dkan/.ahoy/.docker/etc/solr/3.x/schema.xml +++ b/dkan/.ahoy/.docker/etc/solr/3.x/schema.xml @@ -7,7 +7,7 @@ or located where the classloader for the Solr webapp can find it. For more information, on how to customize this file, please see - http://wiki.apache.org/solr/SchemaXml + https://wiki.apache.org/solr/SchemaXml --> @@ -101,7 +101,7 @@ - + @@ -499,7 +499,7 @@ + https://wiki.apache.org/solr/SpatialSearch#geodist_-_The_distance_function --> @@ -528,7 +528,7 @@ - + diff --git a/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig.xml b/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig.xml index e8130a3c3..b1e724b33 100644 --- a/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig.xml +++ b/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig.xml @@ -18,7 +18,7 @@ @@ -74,7 +74,7 @@ @@ -98,9 +98,9 @@ will cause a serious error to be logged if it can't be loaded. --> - + - 32 @@ -151,18 +151,18 @@ 100000 1000 - @@ -175,15 +175,15 @@ can perform merges in the background using separate threads. The SerialMergeScheduler (Lucene 2.2 default) does not. --> - - - single @@ -227,7 +227,7 @@ This is not needed if lock type is 'none' or 'single' --> false - + @@ -243,7 +243,7 @@ The standard Solr IndexDeletionPolicy implementation supports deleting index commit points on number of commits, age of commit point and optimized status. - + The latest commit point should always be preserved regardless of the criteria. --> @@ -263,29 +263,29 @@ - false + false @@ -299,9 +299,9 @@ Perform a automatically under certain conditions. Instead of enabling autoCommit, consider using "commitWithin" - when adding documents. + when adding documents. - http://wiki.apache.org/solr/UpdateXmlMessages + https://wiki.apache.org/solr/UpdateXmlMessages maxDocs - Maximum number of documents to add since the last commit before automatically triggering a new commit. @@ -325,17 +325,17 @@ --> - + 1024 @@ -407,7 +407,7 @@ There are two implementations of cache available for Solr, LRUCache, based on a synchronized LinkedHashMap, and - FastLRUCache, based on a ConcurrentHashMap. + FastLRUCache, based on a ConcurrentHashMap. FastLRUCache has faster gets and slower puts in single threaded operation and thus is generally faster than LRUCache @@ -432,7 +432,7 @@ initialSize - the initial capacity (number of entries) of the cache. (see java.util.HashMap) autowarmCount - the number of entries to prepopulate from - and old cache. + and old cache. --> - + - + 20 200 @@ -550,10 +550,10 @@ prepared but there is no current registered searcher to handle requests or to gain autowarming data from. - + --> @@ -581,7 +581,7 @@ false - + - - - - - - - @@ -998,14 +998,14 @@ field value analysis will be marked as "matched" for every token that is produces by the query analysis --> - - - @@ -1080,17 +1080,17 @@ - explicit + explicit true - + - @@ -1179,7 +1179,7 @@ @@ -1187,8 +1187,8 @@ This is purely as an example. - In reality you will likely want to add the component to your - already specified request handlers. + In reality you will likely want to add the component to your + already specified request handlers. --> @@ -1201,7 +1201,7 @@ - @@ -1241,7 +1241,7 @@ name and attribute value as parameter value. --> - + @@ -1272,8 +1272,8 @@ This is purely as an example. - In reality you will likely want to add the component to your - already specified request handlers. + In reality you will likely want to add the component to your + already specified request handlers. --> - + - + - @@ -1368,10 +1368,10 @@ - - @@ -1384,7 +1384,7 @@ - @@ -1394,23 +1394,23 @@ - - - - - - ]]> - - @@ -1439,8 +1439,8 @@ .,!? - - @@ -1460,17 +1460,17 @@ Requests can be declared, and then used by name in Update Request Processors - http://wiki.apache.org/solr/UpdateRequestProcessor + https://wiki.apache.org/solr/UpdateRequestProcessor - --> + --> - + text/plain; charset=UTF-8 - + - + 5 @@ -1559,7 +1559,7 @@ @@ -1588,7 +1588,7 @@ *:* - + diff --git a/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig_extra.xml b/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig_extra.xml index c5bc3acfb..ccf03e33f 100644 --- a/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig_extra.xml +++ b/dkan/.ahoy/.docker/etc/solr/3.x/solrconfig_extra.xml @@ -3,7 +3,7 @@ The spell check component can return a list of alternative spelling suggestions. - http://wiki.apache.org/solr/SpellCheckComponent + https://wiki.apache.org/solr/SpellCheckComponent --> diff --git a/dkan/.ahoy/.docker/etc/solr/3.x/stopwords.txt b/dkan/.ahoy/.docker/etc/solr/3.x/stopwords.txt index d7f243e48..1aa28fdf6 100644 --- a/dkan/.ahoy/.docker/etc/solr/3.x/stopwords.txt +++ b/dkan/.ahoy/.docker/etc/solr/3.x/stopwords.txt @@ -1,4 +1,4 @@ # Contains words which shouldn't be indexed for fulltext fields, e.g., because # they're too common. For documentation of the format, see -# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.StopFilterFactory +# https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.StopFilterFactory # (Lines starting with a pound character # are ignored.) diff --git a/dkan/.ahoy/.docker/etc/solr/3.x/synonyms.txt b/dkan/.ahoy/.docker/etc/solr/3.x/synonyms.txt index 7d22eea6d..6a823cf40 100644 --- a/dkan/.ahoy/.docker/etc/solr/3.x/synonyms.txt +++ b/dkan/.ahoy/.docker/etc/solr/3.x/synonyms.txt @@ -1,3 +1,3 @@ # Contains synonyms to use for your index. For the format used, see -# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory +# https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory # (Lines starting with a pound character # are ignored.) diff --git a/dkan/.ahoy/.scripts/dkan-lint.rb b/dkan/.ahoy/.scripts/dkan-lint.rb new file mode 100644 index 000000000..ba75248b1 --- /dev/null +++ b/dkan/.ahoy/.scripts/dkan-lint.rb @@ -0,0 +1,52 @@ +require 'json' +require 'uri' +require 'net/http' +require 'fileutils' +require 'git' + +include FileUtils +include Git + +# Get the list of files from a PR +def get_pr_files(user, repo, pr) + uri = URI.parse("https://api.github.com/repos/#{user}/#{repo}/pulls/#{pr}/files") + + http = Net::HTTP.new(uri.host, uri.port) + request = Net::HTTP::Get.new(uri.request_uri) + http.use_ssl = true + response = http.request(request) + result = JSON.parse(response.body) + files = Array.new + + result.each do |i| + files.push(i['filename']) + end + + return files +end + +if 1==1 + user = 'GetDKAN' + repo = 'dkan' + pr = '2454' + files = get_pr_files(user, repo, pr) +elsif ARGV.any? + files = ARGV +else + FileUtils.cd 'dkan' + g = Git.open('.') + files = g.diff.name_status.select{|k,v| v != "D"}.keys + FileUtils.cd '..' +end + +if files.any? + # Filter file list for approved file types + files.select!{ |i| i[/\.*(\.php|\.inc|\.module|\.install|\.profile|\.info)$/] } + if files.any? + files.map! {|item| 'dkan/' + item} + puts "Linting files:\n" + files.join("\n") + puts `dkan/test/bin/phpcs --standard=Drupal,DrupalPractice -n --ignore=test/dkanextension/*,patches/* #{files.join(" ")}` + else + puts "No files available to lint; ending." + end +end diff --git a/dkan/.ahoy/.scripts/dkan-lint.sh b/dkan/.ahoy/.scripts/dkan-lint.sh deleted file mode 100644 index 4c99e71ae..000000000 --- a/dkan/.ahoy/.scripts/dkan-lint.sh +++ /dev/null @@ -1,26 +0,0 @@ -echo "Installing dependencies.." -cd dkan -bash .ahoy/.scripts/composer-install.sh test - -test/bin/phpcs --config-set installed_paths test/vendor/drupal/coder/coder_sniffer -DRUPAL_FILES='\.*\(.php\|.inc\|.module\|.install\|.profile\|.info\)$' - -if [ ! -z "$1" ]; then - files="$files $@" -fi - -if [ -z "$files" ]; then - files=`git diff --name-only | grep "$DRUPAL_FILES"` -fi - -if [ "$CI_PULL_REQUEST" ]; then - echo Diff URL: "$CI_PULL_REQUEST".diff - files=`curl -sL "$CI_PULL_REQUEST".diff | grep "^+++" | sed 's/+++ b\///g' | grep "$DRUPAL_FILES"` -fi - -if [ ! -z "$files" ]; then - echo "Linting: $files" - test/bin/phpcs --standard=Drupal,DrupalPractice -n $files --ignore=test/dkanextension/* -else - echo "No Drupal file changes available for linting." -fi diff --git a/dkan/.ahoy/dkan.ahoy.yml b/dkan/.ahoy/dkan.ahoy.yml index 659d471f6..f491cc816 100644 --- a/dkan/.ahoy/dkan.ahoy.yml +++ b/dkan/.ahoy/dkan.ahoy.yml @@ -158,9 +158,13 @@ commands: cmd: ahoy cmd-proxy bash dkan/.ahoy/.scripts/dkan-unittests.sh "{{args}}" lint: - usage: Run linter on code + usage: Run linter on DKAN code hidden: true - cmd: ahoy cmd-proxy bash dkan/.ahoy/.scripts/dkan-lint.sh "{{args}}" + cmd: | + ahoy cmd-proxy gem install git + ahoy cmd-proxy bash dkan/.ahoy/.scripts/composer-install.sh dkan/test + ahoy cmd-proxy dkan/test/bin/phpcs --config-set installed_paths dkan/test/vendor/drupal/coder/coder_sniffer + ahoy cmd-proxy ruby dkan/.ahoy/.scripts/dkan-lint.rb {{args}} create-qa-users: usage: Create users for each core role for QA purposes diff --git a/dkan/.circleci/config.yml b/dkan/.circleci/config.yml index d75598a77..f8e73b939 100644 --- a/dkan/.circleci/config.yml +++ b/dkan/.circleci/config.yml @@ -8,7 +8,7 @@ jobs: TZ: "/usr/share/zoneinfo/America/New_York" parallelism: 5 docker: - - image: circleci/php:5.6.31-apache-node-browsers + - image: circleci/php:5.6.35-apache-node-browsers environment: MYSQL_HOST: "127.0.0.1" DATABASE_URL: "mysql://drupal:123@127.0.0.1:3306/drupal" @@ -43,7 +43,9 @@ jobs: command: sudo apt-get update - run: name: Install Packages - command: sudo apt-get install -y ruby libpng-dev libmcrypt-dev mysql-client x11vnc + command: | + sudo apt-get install -y ruby libpng-dev libmcrypt-dev mysql-client x11vnc + sudo gem install git #Available Extensions: #bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mcrypt mssql mysql mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard sybase_ct sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip @@ -118,9 +120,6 @@ jobs: key: v1-dkan-test-vendor paths: - dkan/test/vendor - - run: - name: Run Parallel Behat Tests - command: ruby dkan/.ahoy/.scripts/circle-behat.rb docroot/profiles/dkan/test/features # Lint only on 1st parallel instance. Deploy: blocks until parallelism is done, so doing it this way. - run: name: Run Lint @@ -128,6 +127,9 @@ jobs: if [ "$CIRCLE_NODE_INDEX" -eq "0" ]; then ahoy dkan lint fi + - run: + name: Run Parallel Behat Tests + command: ruby dkan/.ahoy/.scripts/circle-behat.rb docroot/profiles/dkan/test/features # Unit Tests only on 1st parallel instance. Deploy: blocks until parallelism is done, so doing it this way. - run: name: Run PHPUnit Tests diff --git a/dkan/.docker/CHANGELOG.md b/dkan/.docker/CHANGELOG.md deleted file mode 100644 index 034ebf0d3..000000000 --- a/dkan/.docker/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# Changelog - -## 0.12.0 (2015-04-07) - -- Added "browser" node for Behat tests requiring JS support -- Documented using Behat -- CI: circle.docker-compose.yml us now used for automated tests of Drude, while docker-compose.yml is still the one packaged for distribution. This is not ideal... Need to figure out a way to alter docker-compose.yml during the build to comment out sections used in Drude's own CI tests, but optional for end users. - -## 0.11.0 (2015-03-27) - -- Drude Shell (dsh) tool - an all-in-one tool for daily Drude use -- New build and release process -- Using semantic versioning and tracking changes in the CHANGELOG.md file -- CircleCI integration for automated testing and build purposes -- New install and update process -- Documentation overhaul diff --git a/dkan/.docker/README.md b/dkan/.docker/README.md deleted file mode 100644 index 8d9cebe5a..000000000 --- a/dkan/.docker/README.md +++ /dev/null @@ -1,180 +0,0 @@ -# Drude (**Dru**pal **D**ocker **E**nvironment) -Docker and Docker Compose based environment for Drupal. - -[![Circle CI](https://circleci.com/gh/blinkreaction/drude.svg?style=shield)](https://circleci.com/gh/blinkreaction/drude) - - -## Requirements - -Docker is natively supported only on Linux. -Mac and Windows users will need a tiny linux VM layer - [Boot2docker Vagrant Box](https://github.com/blinkreaction/boot2docker-vagrant) - -### Mac and Windows - -1. Get the [Boot2docker Vagrant Box](https://github.com/blinkreaction/boot2docker-vagrant) up and running. -2. Install [dsh](#dsh) tool (Drude Shell) wrapper - - ``` - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-dsh.sh | bash - ``` - -### Linux -1. [Docker](https://docs.docker.com/compose/install/#install-docker) -2. [Docker Compose](https://docs.docker.com/compose/install/#install-compose) -3. Install [dsh](#dsh) tool (Drude Shell) wrapper - - ``` - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-dsh.sh | bash - ``` - - -## Setup - -Drude initial setup is done once per project (e.g. by a team lead). -Once installed into the project repo, Drude can be used by anyone on the team. -To use Drude each team member will need to meet the [requirements](#requirements) outlined above. - -`docker-compose.yml` file and `.docker` folder are good indicators of Drude's presence in the project repo. - -**If this is the first time Drude is being installed into the project, follow the instructions below.** - -The installation process is slightly different based on the OS. - -### Mac - - 1. Make sure your site's docroot is in `/docroot`. - 2. Edit `settings.php` for the site (see [Drupal settings](#drupal-settings) below). - 3. cd `` and run: - - ``` - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-drude.sh | bash - ``` - - 4. Start containers with `dsh up` - -### Windows - - 1. Make sure your site's docroot is in `/docroot`. - 2. Edit `settings.php` for the site (see [Drupal settings](#drupal-settings) below). - 3. Open Git Bash shell and cd into ``, then run: - - ``` - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-drude.sh | bash - ``` - - 4. Start and login into vagrant, cd into ``: - - ``` - vagrant up - vagrant ssh - cd - ``` - - 5. Start containers with `dsh up` - -### Linux - - 1. Make sure your site's docroot is in `/docroot`. - 2. Edit `settings.php` for the site (see [Drupal settings](#drupal-settings) below). - 3. cd `` and run: - - ``` - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-drude.sh | bash - ``` - - 4. Start containers with `dsh up` - - -## Updates - -To update Drude run the following from the `` folder: - - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-drude.sh | bash - -Review the changes, revert any local overrides that were reset and commit into your project git repo. - -Base images will be updated from time to time. Docker Compose does not automatically pull new image versions. -To get an up-to-date version of the entire stack do: - - docker-compose pull - docker-compose up -d - - -## Drupal settings - -Below you will find instructions on configuring you Drupal project to work with Drude. -Some settings are required, others are optional or enahncements. Please review carefully. - -**Required** -- [DB connection settings](.docker/docs/drupal-settings.md#db) -- [File permissions fix](.docker/docs/drupal-settings.md#file-permissions) - -**Optional** -- [Memcache settings](.docker/docs/drupal-settings.md#memcache) - - -## Drude Shell (dsh) - -Drude shell (dsh) is a console tool that simplifies that day-to-day work with Drude. -It provide a set of most commonly used commands and operations for controlling the Boot2docker VM, containers, running drush and other console commands inside the **cli** container. - -See `dsh help` for a complete list. - -`dsh` detects the environment it's launched in and will automatically start the boot2docker VM and launch containers as necessary. -It runs on Mac/Linux directly. On Windows `dsh` runs inside the boot2docker VM. - -### Installation - - curl -s https://raw.githubusercontent.com/blinkreaction/drude/master/install-dsh.sh | bash - -This will install a local dsh wrapper into `/usr/local/bin/dsh`. -The actual dsh script resides in each project individually (in `.docker/bin/dsh`) and is installed into the project along with Drude. The wrapper makes it possible to use `dsh` from anywhere in the project tree. - - -## Console tools (cli) - -**cli** container is ment to serv as a single console to access all necessary command line tools. -The **cli** console can launch with `dsh`: - - dsh bash - -Tools available inside the **cli** container: - -- php-cli, composer, drush7 -- ruby, bundler -- node, npm, bower, grunt -- git, wget, zip, mysql-client -- python - - -## Instructions and tutorials - -- [Running multiple projects](.docker/docs/multiple-projects.md) -- [Overriding default PHP/MySQL/etc. settings](.docker/docs/settings.md) -- [Public access](.docker/docs/public-access.md) -- [DB sandbox mode](.docker/docs/db-sandbox.md) -- [Using Behat](.docker/docs/behat.md) - -## License - -The MIT License (MIT) - -Copyright (c) 2015 BlinkReaction - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/dkan/.docker/VERSION b/dkan/.docker/VERSION deleted file mode 100644 index d33c3a212..000000000 --- a/dkan/.docker/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.12.0 \ No newline at end of file diff --git a/dkan/.docker/bin/docker-bash b/dkan/.docker/bin/docker-bash deleted file mode 100755 index a1c9972fa..000000000 --- a/dkan/.docker/bin/docker-bash +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -if [[ $1 == '' ]]; then - echo "Starting bash..." - docker exec -it $(docker-compose ps -q cli) bash -i -else - docker exec -it $(docker-compose ps -q cli) bash -ic "$*" -fi diff --git a/dkan/.docker/bin/docker-drush b/dkan/.docker/bin/docker-drush deleted file mode 100755 index bf387aff7..000000000 --- a/dkan/.docker/bin/docker-drush +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -docker exec -it $(docker-compose ps -q cli) bash -ic "drush $*" diff --git a/dkan/.docker/bin/dsh b/dkan/.docker/bin/dsh deleted file mode 100755 index 43904110b..000000000 --- a/dkan/.docker/bin/dsh +++ /dev/null @@ -1,576 +0,0 @@ -#!/bin/bash - -help () -{ - echo "dsh - Drude Shell" - echo "Usage: dsh [params]" - echo "Commands list:" - echo - echo " init Set up the project locally. Calls .docker/scripts/drude-init.sh" - echo " start (up) Start vagrant vm (mac only) and docker containers -OR- restarts docker containers" - echo " stop (down, halt) Stop vagrant vm (mac only) or stop containers" - echo " reload (restart) Re-start vagrant vm (mac only) and docker containers" - echo " reset Restart docker containers from scratch (stop, remove, up)" - echo " status (st, ps) Show vm/containers status" - echo " bash Start bash on cli container" - echo " exec (run) Execute a command in cli container (usage: dsh exec [param] [param] [param]...)" - echo " mysql Opens mysql shell to drude database" - echo " mysql-import Truncate database and import from sql dump (usage: dsh mysql-import )" - echo " Note: should be inside your project root" - echo " drush Shorthand for executing drush commands (usage: dsh drush [command] [options])" - echo " cc Shorthand for clearing caches (usage: dsh cc [cache_type] (\"dsh cc\" is equal to \"dsh cc all\")" - echo " behat Run Behat tests" - echo " help Output this help" - echo -} - -#-------------------------- Helper functions -------------------------------- - -# Search for file in current dir and all parent dirs -# @param $1 filename -upfind () -{ - if [[ $1 == '' ]]; then return 1; fi - local up='../' - local pathup='./' - local slashes=$(pwd | sed 's/[^\/]//g') - for i in $(seq 0 ${#slashes}) ; do - if [ -f "${pathup}$1" ] ; then - echo "${pathup}" - break - else - pathup=$pathup$up - fi - done -} - -yml_get_path () -{ - echo `upfind docker-compose.yml` -} - -# Returns absolute path -get_abs_path () -{ - local _dir - if [ -f $1 ]; then - _dir=`dirname $1` - elif [ -d $1 ]; then - _dir=$1 - else - echo "Path \"$1\" does not exist" - return - fi - local absolute=$( cd "${_dir}" ; pwd ) - echo "$absolute" -} - -# Returns project root absolute path -get_project_root_path () -{ - yml_path=`yml_get_path` - # get relative project root path from docker-compose.yml config - local project_root_relative=$(grep "&project_root" ${yml_path}docker-compose.yml | sed 's/.*"\(.*\):.*$/\1/') - local project_root_absolute=$( cd "${yml_path}$project_root_relative" ; pwd ) - echo "$project_root_absolute" -} - -# dummy function to check that command is run along settings.php -get_drush_path () -{ - local docroot=$(get_project_root_path)'/docroot' - local cwd=$(pwd) - local pathdiff=${cwd#$docroot} - if [ "$cwd" == "$pathdiff" ]; then - echo "dsh supports '$argv' command only from docroot directory or directory that contains settings.php" - return 1 - fi - return 0 -} - -# Get current path relative to project root -# @param $1 name of variable to get result -cmdpath () -{ - if [[ $# -ne 1 ]]; then return; fi - project_root_path=$(get_project_root_path) - # leave only part of absolute path that is after project root - local cmdpath=${PWD#$project_root_path/} - if [[ "$cmdpath" == "$(pwd)" ]] ; then - - # if replacement didnt happen then we are in project root or higher - eval $1="." - else - eval $1="$cmdpath" - fi -} - -# Removes invisible residue from the string that remains leftover sometimes -# @param $1 string to cleanup -# @param $2 variable that receives clean string -clean_string () -{ - cleaned=$(echo "$1" | sed -e 's/[^a-zA-Z0-9_-]$//') - eval $2=\'${cleaned}\' -} - -# get mysql connection string -# @param $1 gets result -get_mysql_connect () -{ - # get connection string and cleanup residue that is leftover - clean_string "$(_run drush sql-connect)" clean_res - eval $1=\'$clean_res\' -} - -#----------------------- Basics check functions ----------------------------- - -is_linux () -{ - res=`uname | grep 'Linux'` - if [[ ! "$res" == '' ]]; then - return 0; - else - return 1; - fi -} - -# cheсks wether we are in boot2docker console -is_boot2docker () -{ - local res=`uname -a|grep 'boot2docker'` - if [[ ! "$res" == '' ]]; then - return 0; - else - return 1; - fi -} - -# checks if binary exists and callable in PATH -binary_found () -{ - if [[ "$1" == "" ]]; then - return 1; - fi - - local bpath=`which $1` - - if [[ "$bpath" != "" ]] && [ -f `which $1` ]; then - return 0 - else - echo "\"$1\" executable not found." - return 1 - fi -} - -# check that vagrant binary exists -is_vagrant () -{ - if is_linux ; then return 1; fi - if is_boot2docker ; then return 1; fi - binary_found 'vagrant'; - return $? -} - -# check that docker-compose binary exists -is_docker_compose () -{ - binary_found 'docker-compose'; - return $? -} - -# check that docker binary exists -is_docker () -{ - binary_found 'docker'; - return $? -} - -# Checks if yml or vagrantfile (win, mac) is absent -is_yml_absent () -{ - local vagrant_path='' - - yml_path=`yml_get_path` - if [ "$yml_path" == "" ] ; then - echo "dsh: docker-compose.yml not found in your directory tree" - return 0 - fi - - if is_linux ; then - return 1; # linux does not need vagrant - fi - - vagrant_path=`upfind "Vagrantfile"` - if [ "$vagrant_path" == "" ] ; then - echo "dsh: Vagrantfile not found in your directory tree" - return 0 - fi - - #if we got here files are present - return 1 -} - -# Checks if vm exists (as per vagrant) -is_vm_exist () -{ - if is_yml_absent ; then return 2; fi - if is_linux || is_boot2docker ; then return 0; fi - if is_vagrant ; then - res=`vagrant status | grep -e "boot2docker.*not created"` - if [[ "$res" == "" ]]; then - return 0 - else - echo "dsh: Vagrant reports that boot2docker vm is not created. Please check you Vagrantfile or run \"dsh up\"" - return 1 - fi - else - return 2 - fi -} - -# Checks if vm is stopped -is_vm_stopped () -{ - if is_yml_absent ; then return 2; fi - if is_linux || is_boot2docker ; then return 1; fi - if is_vagrant ; then - res=`vagrant status | grep -e "boot2docker.*running"` - if [[ "$res" == "" ]]; then - return 0 - else - return 1 - fi - else - return 2 - fi -} - -#------------------------------- Commands ----------------------------------- -# bring box up -up () -{ - echo "Checking files..." - if is_yml_absent ; then return 2; fi - if is_vagrant ; then - echo "Starting vagrant vm..." - vagrant up - started=$? - if [ $started -eq 0 ] && is_docker_compose ; then - echo "Starting containers..." - cd `yml_get_path` - docker-compose up -d - fi - elif ( is_boot2docker || is_linux ) && is_docker_compose ; then - echo "Starting containers..." - cd `yml_get_path` - docker-compose up -d - fi -} - -# stop box -down () -{ - if is_yml_absent ; then return 2; fi - if ! is_vm_exist ; then return 2; fi - if is_vagrant ; then - echo "Stopping vagrant vm..." - vagrant halt - elif ( is_boot2docker || is_linux ) && is_docker_compose ; then - echo "Stopping containers..." - cd `yml_get_path` - docker-compose stop - fi -} - -# call 911 -restart () -{ - echo "Checking files..." - if is_yml_absent ; then return 2; fi - if ! is_vm_exist ; then return 2; fi - if is_vagrant ; then - echo "Restarting vagrant vm..." - vagrant reload - started=$? - if [ $started -eq 0 ] && is_docker_compose ; then - echo "Starting containers..." - cd `yml_get_path` - docker-compose up -d - fi - elif ( is_boot2docker || is_linux ) && is_docker_compose ; then - echo "Restarting containers..." - cd `yml_get_path` - docker-compose up -d - fi -} - -# output status of boot2docker if stopped or containers if started -status () -{ - if ! is_vm_exist ; then return 2; fi - if is_yml_absent ; then return 2; fi - is_vm_stopped - stopped=$? - case $stopped in - 2) - return - ;; - 1) - if is_docker_compose ; then - cd `yml_get_path` - docker-compose ps - fi - ;; - 0) - echo "boot2docker is not running" - if ! is_vm_exist ; then - return - else - echo "Run \"dsh up\" to start boot2docker" - fi - ;; - esac -} - -# start interactive bash in container -_bash () -{ - if is_yml_absent ; then return 2; fi - cd `yml_get_path` - if is_docker && is_docker_compose ; then - local container_id - clean_string $(docker-compose ps -q cli) container_id - docker exec -it $container_id bash -i - RES=$? - fi -} - -# Run a command in container in project root -# param $* command with it's params to run -run () -{ - if is_docker && is_docker_compose ; then - cd `yml_get_path` - clean_string $(docker-compose ps -q cli) container_id - docker exec -it $container_id bash -ic "$*" - fi -} - -# Run a command in container changing dir to the same folder -# param $* command with it's params to run -_run () -{ - if is_yml_absent ; then return 2; fi - if is_docker && is_docker_compose ; then - local cd_path='' - cmdpath cd_path - run "cd $cd_path && $*" - fi -} - -# start interactive mysql shell -mysql () -{ - if is_yml_absent ; then return 2; fi - if ! get_drush_path; then return; fi - local sql_connect - get_mysql_connect sql_connect - _run $sql_connect" -A" # -A option to speed up mysql load -} - -# Truncate db and import from sql dump -# @param $1 filename of backup file. Should be inside project root -mysql_import () -{ - if is_yml_absent ; then return 2; fi - if ! get_drush_path; then return; fi - project_root=$(get_project_root_path) - local filename=`basename $1` - local filepath=`get_abs_path $1` - #substract project root path from filepath - local pathdiff=${filepath#$project_root} - - if [[ $pathdiff == $filepath ]] ; then - # substraction did not succeed because file is outside project root - echo "\"$filename\" should be inside your project root folder" - return - fi - - _confirm "[!] This will delete all current data in database 'drupal'." - - echo $(_drush sql-drop -y) - local sql_connect - get_mysql_connect sql_connect - echo "Importing $filename into database 'drupal'..." - run "pv ./$pathdiff/$filename | "$sql_connect - echo "mysql-import finished" -} - -# Shortcut to run drush cc ... on site -# @param $1 type of cache to clean (all, css-js, ...) -clear_cache () -{ - if is_yml_absent ; then return 2; fi - if ! get_drush_path; then return; fi - local type='all' - if [[ ! "$1" == "" ]]; then - type=$1 - fi - _run 'drush cc '$type -} - -# shorthand for executing drush commands -_drush () -{ - if is_yml_absent ; then return 2; fi - if ! get_drush_path; then return; fi - _run 'drush '$* -} - -# Run Behat tests (also install dependencies through Composer) -# @param $* arguments and params passed to Behat -behat () -{ - if is_yml_absent ; then return 2; fi - local project_root_path=$(get_project_root_path) - if [[ ! -f "$project_root_path/tests/behat/behat.yml" ]]; then - echo "Missing behat.yml in tests/behat. Aborting..." - exit - fi - run 'cd tests/behat && composer install --prefer-source --no-interaction' - run 'cd tests/behat && bin/behat -p docker '$* -} - -# Set up the project locally -# Calls .docker/scripts/drude-init.sh script, so it must exist. -init () -{ - local project_root_path=$(get_project_root_path) - local init_script="$project_root_path/.docker/scripts/drude-init.sh" - if [[ -f $init_script ]]; then - exec $init_script - else - echo "Project init script is missing: $init_script" - echo "See $project_root_path/.docker/scripts/example.drude-init.sh for a starting point." - exit -1 - fi -} - -# Yes/no confirmation dialog with an optional message -# @param $1 confirmation message -_confirm () -{ - while true; do - read -p "$1 Continue? [y/n]: " answer - case $answer in - [Yy]|[Yy][Ee][Ss] ) - echo "Working..." - break - ;; - [Nn]|[Nn][Oo] ) - echo 'Ok, whatever.' - exit - ;; - * ) - echo 'Please answer yes or no.' - esac - done -} - -# Reset containers (stop, remove, up) -reset () -{ - _confirm "[!] This will delete all project containers including the DB one."; - - echo "Checking files..." - if is_yml_absent ; then return 2; fi - if is_vagrant ; then - echo "Starting vagrant vm..." - vagrant up - started=$? - if [ $started -eq 0 ] && is_docker_compose ; then - echo "Resetting containers..." - cd `yml_get_path` - docker-compose stop && docker-compose rm --force && docker-compose up -d - fi - elif ( is_boot2docker || is_linux ) && is_docker_compose ; then - echo "Resetting containers..." - cd `yml_get_path` - docker-compose stop && docker-compose rm --force && docker-compose up -d - fi -} - -# command bindings -argv="$@" -case $1 in - up) - up - ;; - start) - up - ;; - stop) - down - ;; - down) - down - ;; - halt) - down - ;; - restart) - restart - ;; - reload) - restart - ;; - status) - status - ;; - st) - status - ;; - ps) - status - ;; - bash) - _bash - ;; - exec) - shift - _run $* - ;; - run) - shift - _run $* - ;; - mysql) - mysql - ;; - mysql-import) - mysql_import $2 - ;; - cc) - clear_cache $2 - ;; - drush) - shift - _drush $* - ;; - behat) - shift - behat $* - ;; - init) - shift - init - ;; - reset) - shift - reset - ;; - *) - help - exit 0 -esac diff --git a/dkan/.docker/docs/behat.md b/dkan/.docker/docs/behat.md deleted file mode 100644 index 7e256f320..000000000 --- a/dkan/.docker/docs/behat.md +++ /dev/null @@ -1,47 +0,0 @@ -# Using Behat - -## Expected folder structure - -Drude expects your Behat tests to be in `tests/behat` folder of the project repo. - -> tests/behat -> \_ bin/behat -> \_ behat.yml -> \_ composer.json -> \_ composer.lock - -See [drude-testing](https://github.com/blinkreaction/drude-testing) repo for a good working example. This repo is used for automated tests of Drude builds. - -## Docker profile example - -Assuming you are using [Behat Drupal Extension](https://github.com/jhedstrom/drupalextension) add the following profile in your `behat.yml` file: - -```yml -# Docker profile. -# For use inside the CLI container in Drude. -docker: - extensions: - Behat\MinkExtension: - # URL of the site when accessed inside Drude. - base_url: http://web - selenium2: - wd_host: http://browser:4444/wd/hub - # Stick with chrome by default. It's 2x faster than firefox or phantomjs (your results may vary). - browser_name: chrome - Drupal\DrupalExtension: - drupal: - # Site docroot inside Drude. - drupal_root: /var/www/docroot - drush: - # Site docroot inside Drude. - root: /var/www/docroot -``` -This will configure Behat for use with Drude. - -## Running tests - -Tests can be launched with `dsh` (Drude Shell): - - dsh behat - -This will download composer dependencies and run behat with the docker profile. diff --git a/dkan/.docker/docs/db-sandbox.md b/dkan/.docker/docs/db-sandbox.md deleted file mode 100644 index 33f63103f..000000000 --- a/dkan/.docker/docs/db-sandbox.md +++ /dev/null @@ -1,104 +0,0 @@ -# DB sandbox mode - -In certain cases you may want to have a DB sandbox and mess around with the DB, then roll it back. -Normally this can be achieved by backing up the DB and restoring it from the created DB dump. -With large databases (over 500MB) this operation can take a considerable amount of time (10+ minutes). - -With Docker we can sandbox the DB by creating a reusable docker image from the DB container. -Spinning up such image takes less time than re-importing the DB with MySQL. - -For example, a 2.6GB DB dump file takes 14 minutes to import with MySQL. (Re)launching a docker container from an image with that same imported dump takes only 2 minutes. **Your results may obviously vary.** - -This is an advanced used case, so make sure you have a backup of the database before proceeding. -Follow instructions below to get started. - -## How it works - -In Docker terminology, a read-only [Layer](https://docs.docker.com/terms/layer/#layer) is called an image. In traditional setup you use mysql as Base Docker Image for your DataBase container node. - -:page_facing_up: docker-compose.yml -```yml -# DB node -db: - image: blinkreaction/mysql:5.5 - volumes: - ... - # Permanent DB data storage - - /var/lib/mysql - ``` - -An image never changes. Thanks to [Union File System](https://docs.docker.com/terms/layer/#union-file-system) when process wants to write a file to an image, the Docker creates a copy of that file in Writable Container (the top-most writeable layer). - -However all changes to containers are not permanent hence in traditional setup you have the `/var/lib/mysql` external volume to save them permanently outside of `db` container. - - - -For sandboxed DB you remove this permanent storage, import your database into Writeable Container's memory and create a new Docker Image from your container with `docker commit` command. New image will include Base Image plus all in-memory changes made i.e. your DataBase snapshot. It is then used as a Base Image for your DB container. - -:page_facing_up: docker-compose.yml -```yml -# DB node -db: - image: mysql_with_my_database:snapshot1 - volumes: - ... - # Permanent DB data storage (turned off) - # - /var/lib/mysql - ``` - - - -Now you can do any changes to database you want but each time after the container is restarted all changes will be lost (as it doesn't have external persistant storage) and you will be back to your Base Image `mysql_with_my_database:snapshot1`. - -## Steps - -1. Create a DB dump -2. Stop and remove running containers - - `docker-compose stop && docker-compose rm --force` - -3. Comment out the `/var/lib/mysql` volume definition for the **db** service in `docker-compose.yml` -4. Restart containers - - `docker-compose up -d` - -5. Import the DB dump you created in step 1. -6. Stop and [commit](https://docs.docker.com/reference/commandline/cli/#commit) the **db** service container (this will turn the container into a reusable docker image) - - `docker stop $(docker-compose ps -q db) && docker commit $(docker-compose ps -q db) ` - - Replace `` with any meaningful tag you'd like to use for the image. E.g. `db_backup` or `dbdata/myproject:snapshot1` - -7. Edit the image definition for the *db* service in `docker-compose.yml` and replace it with the selected tag. E.g.: - - `image: dbdata/myproject:snapshot1` - -8. Restart containers - - `docker-compose up -d` - -You will now have a sandboxed DB container, which defaults to the DB snapshot you created in step 1 every time the db container is restarted. - -## Precaution - -In case you have a large database it is not recommended to commit the container that already runs on snaphot Base Image (i.e. creating snapshot on top of snapshot). Every docker image holds all parent images + in-memory changes inside it. Thus, **with every commit the size of the resulting image will increase by full size of the DB, not its delta.** - -In case of small database though it is ok to do that. But please keep in mind there's a limitation on depth of layers which currently equals 120. - -## Disabling the sandbox mode - -You will need a DB dump to revert to. -Either use the one created before enabling the sandbox mode or take another one while the **db** service contained is still up. - -1. Stop and remove running containers - - `docker-compose stop && docker-compose rm --force` - -2. Revert the changes done to the **db** service in `docker-compose.yml` -3. Restart containers - - `docker-compose up -d` - -5. Import the DB dump. - -Now the **db** service container is using a persistent data storage volume (`/var/lib/mysql`). diff --git a/dkan/.docker/docs/drupal-settings.md b/dkan/.docker/docs/drupal-settings.md deleted file mode 100644 index 13638dd9d..000000000 --- a/dkan/.docker/docs/drupal-settings.md +++ /dev/null @@ -1,81 +0,0 @@ -# Drupal settings - - -# DB connection settings - -Containers do not have static IP addresses assigned. DB connection settings can be obtained from the environment variables. - -Below are sample settings for Drupal 7 and Drupal8. -If you change the DB node name in `docker-compose.yml` (e.g. `mysql` instead of `db`) then this has to be updated, since variable names will change as well. - -**Drupal 7** - -```php -$databases = array ( - 'default' => - array ( - 'default' => - array ( - 'database' => getenv('DB_1_ENV_MYSQL_DATABASE'), - 'username' => getenv('DB_1_ENV_MYSQL_USER'), - 'password' => getenv('DB_1_ENV_MYSQL_PASSWORD'), - 'host' => getenv('DB_1_PORT_3306_TCP_ADDR'), - 'port' => '', - 'driver' => 'mysql', - 'prefix' => '', - ), - ), -); - -``` - -**Drupal 8** - -```php -$databases['default']['default'] = array ( - 'database' => getenv('DB_1_ENV_MYSQL_DATABASE'), - 'username' => getenv('DB_1_ENV_MYSQL_USER'), - 'password' => getenv('DB_1_ENV_MYSQL_PASSWORD'), - 'prefix' => '', - 'host' => getenv('DB_1_PORT_3306_TCP_ADDR'), - 'port' => '3306', - 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql', - 'driver' => 'mysql', -); -``` - - -## File permissions fix - -With NFS mounts Drupal may complain about files directory not being writable. This is a "false-negative" however can be annoying and break certain things. For a workaround add the following to your setting.php file. - -**Drupal 7** - -```php -# Workaround for permission issues with NFS shares in Vagrant -$conf['file_chmod_directory'] = 0777; -$conf['file_chmod_file'] = 0666; -``` - -You may also have to reset permissions on the existing files folder. The following command will recursively set folders to 777 (rwx) and files to 666 (rw) - -```bash -chmod -R +rwX files -``` - - -## Memcache settings - -1. Uncomment the **memcached** service definition section in [`docker-compose.yml`](docker-compose.yml) to start using memcached. - -2. Add the following lines to `settings.php` to point Drupal to the memcached node. Replace `` with path to [memcache module](https://www.drupal.org/project/memcache) in your project. E.g. `sites/all/modules/contrib/memcache` - -```php -// Memcache -$conf['cache_backends'][] = '/memcache.inc'; -$conf['cache_default_class'] = 'MemCacheDrupal'; -$conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; -$conf['memcache_servers'] = array( - 'memcached:11211' => 'default', -); -``` diff --git a/dkan/.docker/docs/img/unionfs-container.png b/dkan/.docker/docs/img/unionfs-container.png deleted file mode 100644 index b4ce289fe..000000000 Binary files a/dkan/.docker/docs/img/unionfs-container.png and /dev/null differ diff --git a/dkan/.docker/docs/img/unionfs-your-image.png b/dkan/.docker/docs/img/unionfs-your-image.png deleted file mode 100644 index d8c1d01af..000000000 Binary files a/dkan/.docker/docs/img/unionfs-your-image.png and /dev/null differ diff --git a/dkan/.docker/docs/multiple-projects.md b/dkan/.docker/docs/multiple-projects.md deleted file mode 100644 index 7e54c32d8..000000000 --- a/dkan/.docker/docs/multiple-projects.md +++ /dev/null @@ -1,25 +0,0 @@ -# Working with multiple projects - -Follow the [setup](#setup) instructions for each project making sure that ports used by containers accross all projects do not collide (e.g. two containers cannot use port 80 at the same time). - -This requires a slight modification of the `docker-compose.yml`. -Edit the `ports` key for each container that does port mapping in `docker-compose.yml`. -You can either map unique ports for each container or use dedicated IPs: - -**Unique ports** - -```yml -ports: - - "8080:80" - - "8443:443" -``` - -**Dedicated IP** - -```yml -ports: - - "192.168.10.11:80:80" - - "192.168.10.11:443:443" -``` - -For Mac and Windows see (boot2docker-vagrant/Vagrantfile)[https://github.com/blinkreaction/boot2docker-vagrant/blob/master/Vagrantfile] for instructions on enabling additional IPs for the Boot2docker VM. diff --git a/dkan/.docker/docs/public-access.md b/dkan/.docker/docs/public-access.md deleted file mode 100644 index 3d3ca0602..000000000 --- a/dkan/.docker/docs/public-access.md +++ /dev/null @@ -1,20 +0,0 @@ -# Public Access - -In certain cases you may need to share or expose you local web server on the internet. -E.g. share access with a teammate or customer to demonstrate the work or discuss the progress. -Working with external web services that expect a callback URL is also generally not possible with a local environment. - -## Welcome to ngrok! - -ngrok creates a tunnel from the public internet **http://subdomain.ngrok.com** to a port on your local machine. -You can give this URL to anyone to allow them to try out a web site you're developing without doing any deployment. - -## How to use - -Uncomment the **share** service definition section in [`docker-compose.yml`](../../docker-compose.yml) to start using ngrok. - -To get the *.ngrok.com address, check the container's logs: - - docker-compose logs share - -The ngrok web inspection interface is running on port 4040. E.g. `http://192.168.10.10:4040` diff --git a/dkan/.docker/docs/settings.md b/dkan/.docker/docs/settings.md deleted file mode 100644 index f342dbad5..000000000 --- a/dkan/.docker/docs/settings.md +++ /dev/null @@ -1,8 +0,0 @@ -# Overriding default PHP/MySQL/etc. settings - -## Altering PHP and MySQL configuration - -The following configuration files are mounted inside the respective containers and can be used to override the default settings: - -- [.docker/etc/php5/php.ini](.docker/etc/php5/php.ini) - PHP settings overrides -- [.docker/etc/mysql/my.cnf](.docker/etc/mysql/my.cnf) - MySQL settings overrides diff --git a/dkan/.docker/etc/mysql/my.cnf b/dkan/.docker/etc/mysql/my.cnf deleted file mode 100644 index 2cd1f9c37..000000000 --- a/dkan/.docker/etc/mysql/my.cnf +++ /dev/null @@ -1,22 +0,0 @@ -[mysqld] -############################### -local_infile=1 -# Acquia DD settings -#set innodb as default -default-storage-engine=InnoDB - -innodb_log_buffer_size=32M -innodb_buffer_pool_size=256M -innodb_log_file_size=32M - -innodb_file_per_table=1 - -#Max packets -max_allowed_packet = 128M - -#Enable slow query log -long_query_time=1 -slow_query_log=1 -slow_query_log_file=slow.log - -############################### diff --git a/dkan/.docker/etc/php5/php-cli.ini b/dkan/.docker/etc/php5/php-cli.ini deleted file mode 100644 index b69d1d0ac..000000000 --- a/dkan/.docker/etc/php5/php-cli.ini +++ /dev/null @@ -1,19 +0,0 @@ -; PHP CLI settings -[php] -; Maximum amount of memory a script may consume -memory_limit = 512M - -[xdebug] -xdebug.default_enable=On -xdebug.remote_enable=On -xdebug_remote_handler=dbgp -xdebug.remote_host=192.168.99.1 -xdebug.remote_autostart=1 -xdebug.remote_port=9000 -xdebug.remote_log="/var/log/xdebug.log" -xdebug.idekey="netbeans-xdebug" -xdebug.show_local_vars=On -xdebug.var_display_max_data=10000 -xdebug.var_display_max_depth=20 -xdebug.max_nesting_level=200 -xdebug.extended_info=On diff --git a/dkan/.docker/etc/php5/php.ini b/dkan/.docker/etc/php5/php.ini deleted file mode 100644 index b3294b21c..000000000 --- a/dkan/.docker/etc/php5/php.ini +++ /dev/null @@ -1,33 +0,0 @@ -; PHP settings -[php] -; Maximum amount of memory a script may consume -memory_limit = 256M - -; APC opcode cache settings (PHP 5.3) -[apc] -apc.enabled=1 -apc.shm_segments=1 -apc.shm_size=128M -apc.ttl=7200 -apc.user_ttl=7200 -apc.num_files_hint=1024 -apc.enable_cli=0 - -; OPcache settigns (PHP 5.5) -[opcache] -opcache.memory_consumption=128 - -; Xdebug settings -[xdebug] -xdebug.default_enable=On -xdebug.remote_enable=On -xdebug_remote_handler=dbgp -xdebug.remote_host=192.168.99.1 -xdebug.remote_autostart=1 -xdebug.remote_port=9000 -xdebug.remote_log="/var/log/xdebug.log" -xdebug.idekey="netbeans-xdebug" -xdebug.show_local_vars=On -xdebug.var_display_max_data=10000 -xdebug.var_display_max_depth=20 -xdebug.max_nesting_level=200 diff --git a/dkan/.docker/etc/solr/3.x/elevate.xml b/dkan/.docker/etc/solr/3.x/elevate.xml deleted file mode 100644 index 71ea0006c..000000000 --- a/dkan/.docker/etc/solr/3.x/elevate.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - diff --git a/dkan/.docker/etc/solr/3.x/mapping-ISOLatin1Accent.txt b/dkan/.docker/etc/solr/3.x/mapping-ISOLatin1Accent.txt deleted file mode 100644 index b92d03c55..000000000 --- a/dkan/.docker/etc/solr/3.x/mapping-ISOLatin1Accent.txt +++ /dev/null @@ -1,14 +0,0 @@ -# This file contains character mappings for the default fulltext field type. -# The source characters (on the left) will be replaced by the respective target -# characters before any other processing takes place. -# Lines starting with a pound character # are ignored. -# -# For sensible defaults, use the mapping-ISOLatin1Accent.txt file distributed -# with the example application of your Solr version. -# -# Examples: -# "À" => "A" -# "\u00c4" => "A" -# "\u00c4" => "\u0041" -# "æ" => "ae" -# "\n" => " " diff --git a/dkan/.docker/etc/solr/3.x/protwords.txt b/dkan/.docker/etc/solr/3.x/protwords.txt deleted file mode 100644 index cda858149..000000000 --- a/dkan/.docker/etc/solr/3.x/protwords.txt +++ /dev/null @@ -1,7 +0,0 @@ -#----------------------------------------------------------------------- -# This file blocks words from being operated on by the stemmer and word delimiter. -& -< -> -' -" diff --git a/dkan/.docker/etc/solr/3.x/schema.xml b/dkan/.docker/etc/solr/3.x/schema.xml deleted file mode 100644 index 97077af49..000000000 --- a/dkan/.docker/etc/solr/3.x/schema.xml +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id - - - content - - - - - diff --git a/dkan/.docker/etc/solr/3.x/schema_extra_fields.xml b/dkan/.docker/etc/solr/3.x/schema_extra_fields.xml deleted file mode 100644 index 9ecd5f4fa..000000000 --- a/dkan/.docker/etc/solr/3.x/schema_extra_fields.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/dkan/.docker/etc/solr/3.x/schema_extra_types.xml b/dkan/.docker/etc/solr/3.x/schema_extra_types.xml deleted file mode 100644 index e82072e2f..000000000 --- a/dkan/.docker/etc/solr/3.x/schema_extra_types.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - diff --git a/dkan/.docker/etc/solr/3.x/solrconfig.xml b/dkan/.docker/etc/solr/3.x/solrconfig.xml deleted file mode 100644 index e8130a3c3..000000000 --- a/dkan/.docker/etc/solr/3.x/solrconfig.xml +++ /dev/null @@ -1,1624 +0,0 @@ - - - - - - - - - ${solr.abortOnConfigurationError:true} - - - ${solr.luceneMatchVersion:LUCENE_35} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - 4 - - 32 - - - - 2147483647 - 100000 - 1000 - - - - - - - - - single - - - - - - - - - false - 32 - 10 - - - false - - - true - - - - - 1 - - 0 - - - - - - false - - - - - - - - - - - - - - - - ${solr.autoCommit.MaxDocs:10000} - ${solr.autoCommit.MaxTime:120000} - - - - - - - - - - - - - - - - - 1024 - - - - - - - - - - - - - - - - - - - - - - true - - - - - - 20 - - - 200 - - - - - - - - - - - - solr rocks010 - - - - - - false - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - edismax - explicit - true - 0.01 - - ${solr.pinkPony.timeAllowed:-1} - *:* - - - false - - true - false - - 1 - - - spellcheck - elevator - - - - - - - 1 - 1 - 3 - 15 - 20 - false - - ${solr.mlt.timeAllowed:2000} - - - - - - - explicit - true - - - - - - - - - - - - - - - - - - - - - - text - true - ignored_ - - - true - links - ignored_ - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - pinkPony - solrpingquery - - - all - - - - - - - explicit - true - - - - - - - ${solr.replication.master:false} - commit - startup - ${solr.replication.confFiles:schema.xml,mapping-ISOLatin1Accent.txt,protwords.txt,stopwords.txt,synonyms.txt,elevate.xml} - - - ${solr.replication.slave:false} - ${solr.replication.masterUrl:http://localhost:8983/solr}/replication - ${solr.replication.pollInterval:00:00:60} - - - - - - - - - false - false - 1 - - - spellcheck - - - - - - - - - - true - - - tvComponent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - terms - - - - - - - - string - elevate.xml - - - - - - explicit - - - elevator - - - - - - - - - - - 100 - - - - - - - - 70 - - 0.5 - - [-\w ,/\n\"']{20,200} - - - - - - - ]]> - ]]> - - - - - - - - - - - - - - - - - - - - - ,, - ,, - ,, - ,, - ,]]> - ]]> - - - - - - 10 - .,!? - - - - - - - WORD - - - en - US - - - - - - - - - - - - - - - - - - - text/plain; charset=UTF-8 - - - - - - - - - - 5 - - - - - - - - - - - - - *:* - - - - - - - - - - - - textSpell - - - - default - spell - spellchecker - true - - - - - - diff --git a/dkan/.docker/etc/solr/3.x/solrconfig_extra.xml b/dkan/.docker/etc/solr/3.x/solrconfig_extra.xml deleted file mode 100644 index c5bc3acfb..000000000 --- a/dkan/.docker/etc/solr/3.x/solrconfig_extra.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - -textSpell - - - - - - default - spell - spellchecker - true - - - - - - - - - - - - - - - diff --git a/dkan/.docker/etc/solr/3.x/solrcore.properties b/dkan/.docker/etc/solr/3.x/solrcore.properties deleted file mode 100644 index 37545286a..000000000 --- a/dkan/.docker/etc/solr/3.x/solrcore.properties +++ /dev/null @@ -1,16 +0,0 @@ -# Defines Solr properties for this specific core. -solr.replication.master=false -solr.replication.slave=false -solr.replication.pollInterval=00:00:60 -solr.replication.masterUrl=http://localhost:8983/solr -solr.replication.confFiles=schema.xml,mapping-ISOLatin1Accent.txt,protwords.txt,stopwords.txt,synonyms.txt,elevate.xml -solr.mlt.timeAllowed=2000 -# You should not set your luceneMatchVersion to anything lower than your Solr -# Version. -solr.luceneMatchVersion=LUCENE_35 -solr.pinkPony.timeAllowed=-1 -# autoCommit after 10000 docs -solr.autoCommit.MaxDocs=10000 -# autoCommit after 2 minutes -solr.autoCommit.MaxTime=10000 -solr.contrib.dir=../../contrib diff --git a/dkan/.docker/etc/solr/3.x/stopwords.txt b/dkan/.docker/etc/solr/3.x/stopwords.txt deleted file mode 100644 index d7f243e48..000000000 --- a/dkan/.docker/etc/solr/3.x/stopwords.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Contains words which shouldn't be indexed for fulltext fields, e.g., because -# they're too common. For documentation of the format, see -# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.StopFilterFactory -# (Lines starting with a pound character # are ignored.) diff --git a/dkan/.docker/etc/solr/3.x/synonyms.txt b/dkan/.docker/etc/solr/3.x/synonyms.txt deleted file mode 100644 index 7d22eea6d..000000000 --- a/dkan/.docker/etc/solr/3.x/synonyms.txt +++ /dev/null @@ -1,3 +0,0 @@ -# Contains synonyms to use for your index. For the format used, see -# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory -# (Lines starting with a pound character # are ignored.) diff --git a/dkan/.github/CONTRIBUTING.md b/dkan/.github/CONTRIBUTING.md index 41d925f08..060c04d3d 100644 --- a/dkan/.github/CONTRIBUTING.md +++ b/dkan/.github/CONTRIBUTING.md @@ -67,7 +67,7 @@ Pull requests should include sufficient context for a maintainer to open them fo ### Pull Request Template ``` ## Description -ref: NuCivic/[repo]/[issue#] +ref: GetDKAN/[repo]/[issue#] ## Acceptance Test diff --git a/dkan/CHANGELOG.txt b/dkan/CHANGELOG.txt index 48cb74642..b38cb4a12 100644 --- a/dkan/CHANGELOG.txt +++ b/dkan/CHANGELOG.txt @@ -1,3 +1,26 @@ +7.x-1.15 +---------- +- #2339 Adds a linkchecker to DKAN. +- #2409 Allows the services API to be able to consume datasets with the same format given when retrieving a dataset through the API +- #2434 Disable option to assign content to anonymous user +- #2431 Fix calls to the empty function that check the return value of a function or method +- #2405 & #2427 Improve tests + +7.x-1.14.7 +---------- + - #2473 Security upgrades to Drupal 7.59 and Media 2.9 + - #2470 Get harvest tests passing + - #2468 Update urls to use https rather than http + - #2467 Update command center menu links + - #2464 Move functions out of the dkan_sitewide_menu.install file + +7.x-1.14.6 +---------- + - #2461 Update CONTRIBUTING.md + - #2456 Remove exra docker dir + - #2458 Fix the chrome issue + - #2450 Incorrect Readme Links + 7.x-1.14.5 ---------- - #2435 Update Drupal core to 7.58 @@ -725,7 +748,7 @@ DKAN Dataset: 7.x-1.7 2015-02-20 ------------------- - - Adds Panels to DKAN for Drag and Drop layouts: http://docs.getdkan.com/dkan-documentation/dkan-users-guide/customize-dkan-pages-layouts-and-components-using-panels + - Adds Panels to DKAN for Drag and Drop layouts: https://docs.getdkan.com/dkan-documentation/dkan-users-guide/customize-dkan-pages-layouts-and-components-using-panels - Adds Open Data Schema to DKAN https://github.com/NuCivic/open_data_schema_map#open-data-schema-map - Adds 'saved states' to Recline data preview - DKAN_Datastore: Remove schema patch @@ -733,7 +756,7 @@ DKAN Dataset: DKAN Dataset: - Adds Project Open Data v1.1 schema through open_data_schema_map update - Adds dkan data.json v1.1 complaint implementation through open_data_schema_map_dkan update - - Adds Panels implementation for dkan_dataset_groups: http://docs.getdkan.com/dkan-documentation/dkan-users-guide/customize-dkan-pages-layouts-and-components-using-panels + - Adds Panels implementation for dkan_dataset_groups: https://docs.getdkan.com/dkan-documentation/dkan-users-guide/customize-dkan-pages-layouts-and-components-using-panels - Updates to dkan_dataset stylesheet to make them radix compatible - Security updates for several modules @@ -863,7 +886,7 @@ nüBoot Theme: - Travis + Github integration for all test suites on every commit - Moved issues for all three modules exclusively to dkan's github issues: https://github.com/nuams/dkan/issues/ - Completed CKAN API Read Compliance with the following API methods: package_list, package_show, site_read, package_revision_list, group_list, resource_show, group_package_show and revision_list - - Added nuboot theme (http://drupal.org/project/nuboot) as default dkan theme + - Added nuboot theme (https://drupal.org/project/nuboot) as default dkan theme - Completed 508 compliance on dkan default theme - Several bugs fixed. - DKAN_Datastore: Moved dkan_datastore development to github: https://github.com/nuams/dkan_datastore diff --git a/dkan/README.md b/dkan/README.md index 781055187..ac38a808c 100644 --- a/dkan/README.md +++ b/dkan/README.md @@ -4,7 +4,7 @@ DKAN is an open source open data platform with a full suite of cataloging, publi * [ Official website ](https://getdkan.org) * [ Demo ](http://demo.getdkan.com/) -* [ Documetation ](http://docs.getdkan.com/) +* [ Documetation ](https://docs.getdkan.com/) ## Community @@ -24,9 +24,9 @@ Join the [DKAN Slack community](https://dkansignup.herokuapp.com/). ## Help -* General: [DKAN documentation](http://docs.getdkan.com) -* Developers: Submit a [Github issue](https://github.com/nucivic/dkan/issues) or post to [ #dev ](https://dkan.slack.com/messages/C4BEVFDKJ/) channel in [ DKAN Slack ](https://dkan.slack.com) -* Bugs: Submit a [Github issue](https://github.com/nucivic/dkan/issues) +* General: [DKAN documentation](https://docs.getdkan.com) +* Developers: Submit a [Github issue](https://github.com/GetDKAN/dkan/issues) or post to [ #dev ](https://dkan.slack.com/messages/C4BEVFDKJ/) channel in [ DKAN Slack ](https://dkan.slack.com) +* Bugs: Submit a [Github issue](https://github.com/GetDKAN/dkan/issues) ## Features @@ -47,11 +47,11 @@ Join the [DKAN Slack community](https://dkansignup.herokuapp.com/). ## Installation -Please see the [Installation](http://docs.getdkan.com/en/latest/introduction/installation.html) section of the DKAN Documentation. +Please see the [Installation](https://docs.getdkan.com/en/latest/introduction/installation.html) section of the DKAN Documentation. ### Upgrading DKAN -Please see the [Updating and Maintaining DKAN](http://docs.getdkan.com/en/latest/introduction/maintaining.html) section of the DKAN Documentation for general upgrade information. +Please see the [Updating and Maintaining DKAN](https://docs.getdkan.com/en/latest/introduction/maintaining.html) section of the DKAN Documentation for general upgrade information. ## Releases @@ -86,9 +86,9 @@ Please follow the [Ticket Template](https://github.com/GetDKAN/dkan/blob/7.x-1.x Also, please remember to reference the issue across repositories in order for maintainers to pick up commits and pull requests looking at the issue. You can do that for commits like this: ```bash -git commit -m "Issue NuCivic/dkan#: ..." +git commit -m "Issue GetDKAN/dkan#: ..." ``` -Just replace **** with the actual issue number. You can reference pull requests exactly like that if you add the same text **"NuCivic/dkan#<issue_number>"** in a comment. +Just replace **** with the actual issue number. You can reference pull requests exactly like that if you add the same text **"GetDKAN/dkan#<issue_number>"** in a comment. This helps us with detecting changes and pulling them in faster. diff --git a/dkan/dkan.info b/dkan/dkan.info index 5efb1b8e8..887123feb 100644 --- a/dkan/dkan.info +++ b/dkan/dkan.info @@ -125,4 +125,4 @@ dependencies[] = dkan_datastore dependencies[] = dkan_datastore_api dependencies[] = open_data_schema_map_dkan dependencies[] = visualization_entity_charts_dkan -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/dkan.install b/dkan/dkan.install index 1de81ad6b..f8b6bfa5b 100644 --- a/dkan/dkan.install +++ b/dkan/dkan.install @@ -420,7 +420,7 @@ function dkan_update_7024(&$context) { function dkan_update_7025() { $settings = variable_get('theme_nuboot_radix_settings', array()); if ($settings['copyright']['value'] == 'Powered by DKAN, a project of Granicus') { - $settings['copyright']['value'] = t('Powered by DKAN'); + $settings['copyright']['value'] = t('Powered by DKAN'); variable_set('theme_nuboot_radix_settings', $settings); } } diff --git a/dkan/docs/apis/open-data.rst b/dkan/docs/apis/open-data.rst index 917a9f11f..2d5f4547f 100644 --- a/dkan/docs/apis/open-data.rst +++ b/dkan/docs/apis/open-data.rst @@ -28,27 +28,27 @@ Dataset .. csv-table:: :header: "DKAN Field/Property", "DCAT-AP property", "POD property" - "title", `dct:title `_, "title" - "body", `dct:description `_, `description `_ - "field_tags", `dcat:keyword `_, `keyword `_ - "field_license","", `license `_ + "title", `dct:title `_, "title" + "body", `dct:description `_, `description `_ + "field_tags", `dcat:keyword `_, `keyword `_ + "field_license","", `license `_ "field_author", "", "" "field_spatial_geographical_area", "", "" - "field_spatial_geographical_cover", `dct:spatial `_, `spatial `_ - "field_frequency", `dct:accrualPeriodicity `_, `accrualPeriodicity `_ - "og_group_ref", `dct:publisher `_, `publisher `_ - "field_temporal_coverage", `dct:temporal `_, `temporal `_ + "field_spatial_geographical_cover", `dct:spatial `_, `spatial `_ + "field_frequency", `dct:accrualPeriodicity `_, `accrualPeriodicity `_ + "og_group_ref", `dct:publisher `_, `publisher `_ + "field_temporal_coverage", `dct:temporal `_, `temporal `_ "field_granularity", "", "" - "field_data_dictionary", "", `dataDictionary `_ - "field_contact_name", "dcat:contactPoint.vcard:fn", `contactPoint `_ - "field_contact_email", "dcat:contactPoint.vcard:hasEmail", `mbox `_ - "field_public_access_level", `dct:accessRights `_, `accessLevel `_ + "field_data_dictionary", "", `dataDictionary `_ + "field_contact_name", "dcat:contactPoint.vcard:fn", `contactPoint `_ + "field_contact_email", "dcat:contactPoint.vcard:hasEmail", `mbox `_ + "field_public_access_level", `dct:accessRights `_, `accessLevel `_ "field_additional_info", "", "" - "field_resources", `dcat:distribution `_, `distribution `_ - "field_related_content", "", `references `_ - "uuid", `dct:identifier `_, `identifier `_ - "modified_date", `dct:modified `_, `modified `_ - "release_date", `dct:issued `_, `issued `_ + "field_resources", `dcat:distribution `_, `distribution `_ + "field_related_content", "", `references `_ + "uuid", `dct:identifier `_, `identifier `_ + "modified_date", `dct:modified `_, `modified `_ + "release_date", `dct:issued `_, `issued `_ The following properties are provided by the Open Data Federal Extras module and have no equivilant in DCAT. They are only relevant to U.S. federal agencies. diff --git a/dkan/docs/community/opendatastandards.rst b/dkan/docs/community/opendatastandards.rst index d8f6d6236..08479870f 100644 --- a/dkan/docs/community/opendatastandards.rst +++ b/dkan/docs/community/opendatastandards.rst @@ -71,7 +71,7 @@ Where is metadata displayed in DKAN? When viewing a dataset, you can scroll down the page to the "Dataset Info" section to view its metadata. -The screencap below is an example of metadata for the "Safety Net Clinics" dataset on `HealthData.gov `_: +The screencap below is an example of metadata for the "Safety Net Clinics" dataset on `HealthData.gov `_: .. figure:: ../images/MetadataInDKAN.png @@ -79,7 +79,7 @@ The screencap below is an example of metadata for the "Safety Net Clinics" datas *An example of how metadata is presented within DKAN.* -*Source: ** http://www.healthdata.gov/dataset/safety-net-clinics +*Source: ** https://www.healthdata.gov/dataset/safety-net-clinics Open Data Formats @@ -341,7 +341,7 @@ Follow these simple guidelines to make your data or statistical releases as tidy 5. Numbers in cells should just be numbers. Don’t put commas in them, or stars after them, or anything else. If you need to add an annotation to some rows, use a separate column. -6. Use standard identifiers: e.g. identify countries using [ISO 3166](http://en.wikipedia.org/wiki/ISO_3166) codes rather than names. +6. Use standard identifiers: e.g. identify countries using [ISO 3166](https://en.wikipedia.org/wiki/ISO_3166) codes rather than names. 7. Don’t use only color or other stylistic cues to encode information. If you want to color cells according to their value, use conditional formatting. @@ -356,13 +356,13 @@ More Data Cleaning Resources https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html -http://vita.had.co.nz/papers/tidy-data.html +https://vita.had.co.nz/papers/tidy-data.html https://en.wikipedia.org/wiki/Data_cleansing http://www.ats.ucla.edu/stat/sas/library/nesug99/ss123.pdf -http://betterevaluation.org/sites/default/files/data_cleaning.pdf +https://betterevaluation.org/sites/default/files/data_cleaning.pdf https://support.office.com/en-us/article/Top-ten-ways-to-clean-your-data-2844b620-677c-47a7-ac3e-c2e157d1db19 @@ -378,7 +378,7 @@ https://project-open-data.cio.gov/ https://project-open-data.cio.gov/open-standards/ -http://www.data.gov +https://www.data.gov Project Open Data is the United States’ official policy regarding open data publishing and metadata standards. The homepage explains the mission and goals of Project Open Data and its participants, and the Open Standards page lists standards, specifications, and formats supporting open data objectives. @@ -405,7 +405,7 @@ List of Civic Data Standards: Johns Hopkins University’s GovEx Labs ************************************* -http://labs.centerforgov.org/open-data/civic-data-standards/ +https://labs.centerforgov.org/open-data/civic-data-standards/ Johns Hopkins University’s GovEx labs’ defines a civic data standard as "an an open, collaboratively developed set of data schematics or semantics which facilitates interoperability between multiple providers and consumers for the public good." @@ -416,7 +416,7 @@ The Open Contracting Partnership **Open Contracting Data Standard** -http://www.open-contracting.org/data-standard/ +https://www.open-contracting.org/data-standard/ http://standard.open-contracting.org/latest/en/ @@ -438,7 +438,7 @@ The Open Data Institute **Open Data Maturity Model** -http://theodi.org/guides/maturity-model (other guides: http://theodi.org/guides) +https://theodi.org/guides/maturity-model (other guides: https://theodi.org/guides) The Open Data Institute is a London-based independent non-profit dedicated to using open data to address today’s global challenges. The Open Data Maturity Model is "a way to assess how well an organisation publishes and consumes open data, and identifies actions for improvement. @@ -449,7 +449,7 @@ Open Knowledge International **The Open Data Handbook** -http://opendatahandbook.org/guide/en/ +https://opendatahandbook.org/guide/en/ Open Knowledge International is "a worldwide non-profit network of people passionate about openness, using advocacy, technology and training to unlock information and enable people to work with it to create and share knowledge." @@ -460,7 +460,7 @@ The Sunlight Foundation **Open Data Policy Guidelines** -http://sunlightfoundation.com/opendataguidelines/ +https://sunlightfoundation.com/opendataguidelines/ The Sunlight Foundation is "a nonpartisan nonprofit that advocates for open government globally and uses technology to make government more accountable to all." Their list of open data guidelines addresses what data should be public, how to make data public, and how to implement policy. @@ -507,7 +507,7 @@ The Open Data Substrate GitHub project to catalog open data standardization efforts -http://open-data-standards.github.io/ +https://open-data-standards.github.io/ "The goal of this industry organization is to provide a forum to quickly establish standards so that Open Data implementors can ensure they are developing Open Data solutions that interoperate. This community-driven initiative to promote vendor interoperability and data portability is derived from a fundamental belief that ‘data is more useful’ when ‘more people can use it’." @@ -529,21 +529,21 @@ The Original 8 Principles of Open Government Data [`Source `_ All public data is made available. **Public data** is data that is not subject to valid privacy, security or privilege limitations. +1. **Complete** All public data is made available. **Public data** is data that is not subject to valid privacy, security or privilege limitations. -2. `Primary `_ Data is as collected at the source, with the highest possible level of granularity, not in aggregate or modified forms. +2. **Primary** Data is as collected at the source, with the highest possible level of granularity, not in aggregate or modified forms. -3. `Timely `_ Data is made available as quickly as necessary to preserve the value of the data. +3. **Timely** Data is made available as quickly as necessary to preserve the value of the data. -4. `Accessible `_ Data is available to the widest range of users for the widest range of purposes. +4. **Accessible** Data is available to the widest range of users for the widest range of purposes. -5. `Machine processable `_ Data is reasonably structured to allow automated processing. +5. **Machine processable** Data is reasonably structured to allow automated processing. -6. `Non-discriminatory `_ Data is available to anyone, with no requirement of registration. +6. **Non-discriminatory** Data is available to anyone, with no requirement of registration. -7. `Non-proprietary `_ Data is available in a format over which no entity has exclusive control. +7. **Non-proprietary** Data is available in a format over which no entity has exclusive control. -8. `License-free `_ Data is not subject to any copyright, patent, trademark or trade secret regulation. Reasonable privacy, security and privilege restrictions may be allowed. +8. **License-free** Data is not subject to any copyright, patent, trademark or trade secret regulation. Reasonable privacy, security and privilege restrictions may be allowed. Relevant Reading Materials diff --git a/dkan/docs/components/dataset/usage.rst b/dkan/docs/components/dataset/usage.rst index 6357a525f..b3dfff90d 100644 --- a/dkan/docs/components/dataset/usage.rst +++ b/dkan/docs/components/dataset/usage.rst @@ -63,7 +63,7 @@ Let's take a closer look at some of the metadata fields available on this form: :Frequency: How often is this dataset updated? We might expect our list of polling places to be updated every year, so we could select "annually." However, often we don't expect the data to be updated (even in this case, perhaps we plan to post the next version of the data as a _separate_ dataset), in which case we can leave this blank. :Temporal Coverage: Like Geographic Coverage, this field lets us give some context to the data, but now for the relevant time period. Here we could enter the year or years for which our polling places data is accurate. :Granularity: This is a somewhat open-ended metadata field that lets you describe the granularity or accuracy of your data. For instance: "Year". Note, this field is depreciated in DCAT and Project Open Data, and may be removed from DKAN. -:Data Dictionary: This should be a URL to a resource that provides some sort of description that helps understanding the data. See `Project Open Data data dictionary `_ for more info. +:Data Dictionary: This should be a URL to a resource that provides some sort of description that helps understanding the data. See `Project Open Data data dictionary `_ for more info. :Additional Info: Lets us arbitrarily define other metadata fields. See :ref:`Additional Info field ` for more information. :Resources: This field is a reference to the resources you have already added. diff --git a/dkan/docs/components/federal-extras.md b/dkan/docs/components/federal-extras.md index 2c518019d..16720d3fd 100644 --- a/dkan/docs/components/federal-extras.md +++ b/dkan/docs/components/federal-extras.md @@ -13,7 +13,7 @@ The [Open Data Federal Extras Module](https://github.com/GetDKAN/dkan/tree/7.x-1 Enabling the module will add these fields to your Dataset content type. Note that _disabling_ the module will _not_ remove them. To remove the fields completely (which will permanently delete all data in those fields), _uninstall_ the module from the module administration screen or via `drush pm-uninstall`. ### Updating the Program Code list -1. Go to http://project-open-data.github.io/schema/#programCode +1. Go to https://project-open-data.github.io/schema/#programCode 2. Download "Federal Program Inventory" 3. Export in csv to ``fed_program_code_list`` 4. cd 'fed_program_code_list' diff --git a/dkan/docs/components/index.rst b/dkan/docs/components/index.rst index 5851adef4..342e12b94 100644 --- a/dkan/docs/components/index.rst +++ b/dkan/docs/components/index.rst @@ -28,6 +28,7 @@ described inside the Datasets section, all this functionality is provided by the Storytelling Open Data Schema Map Visualizations + Link checker .. note:: The three modules mentioned above that are not distributed with DKAN continue to be maintained in separate repositories because they work diff --git a/dkan/docs/components/linkchecker.rst b/dkan/docs/components/linkchecker.rst new file mode 100644 index 000000000..2504f4add --- /dev/null +++ b/dkan/docs/components/linkchecker.rst @@ -0,0 +1,26 @@ +DKAN Link Checker +================= + +DKAN Link Checker adds configuration and additional reporting to the `link checker `_ module. + + The Link checker module extracts links from your content when saved and periodically tries to detect broken hypertext links by checking the remote sites and evaluating the HTTP response codes. + +Installation +------------ +DKAN Link checker will check links in datasets, resources, and harvest sources. It is not enabled by default, to enable it, run these commands: + +- ``drush en dkan_linkchecker -y`` +- ``drush cc all`` +- ``drush linkchecker-analyze`` +- ``drush cron`` + +Links will be processed in batches and it may take a while to go through all of the links of your site. + +Permissions +----------- +Users with the **site manager** role will be able to + +- View the broken links report at ``admin/reports/dkan-linkchecker-report`` +- Access the link checker configuration screen at ``admin/config/content/linkchecker`` + +For more information on link checker `click here `_ diff --git a/dkan/docs/components/open-data-schema.md b/dkan/docs/components/open-data-schema.md index aa38cbd4e..7622d5186 100644 --- a/dkan/docs/components/open-data-schema.md +++ b/dkan/docs/components/open-data-schema.md @@ -1,6 +1,6 @@ # Open Data Schema Map -This module provides a flexible way to expose your Drupal content via APIs following specific Open Data schemas. Currently, the [CKAN](http://docs.ckan.org/en/ckan-1.8/domain-model-dataset.html), [Project Open Data](http://project-open-data.github.io/schema/) and [DCAT-AP](https://joinup.ec.europa.eu/asset/dcat_application_profile/description) schemas are provided, but new schemas can be easily added through your own modules. A user interface is in place to create endpoints and map fields from the chosen schema to Drupal content using tokens. +This module provides a flexible way to expose your Drupal content via APIs following specific Open Data schemas. Currently, the [CKAN](http://docs.ckan.org/en/ckan-1.8/domain-model-dataset.html), [Project Open Data](https://project-open-data.github.io/schema/) and [DCAT-AP](https://joinup.ec.europa.eu/asset/dcat_application_profile/description) schemas are provided, but new schemas can be easily added through your own modules. A user interface is in place to create endpoints and map fields from the chosen schema to Drupal content using tokens. This module was developed as part of the DKAN project, but will work on an Drupal 7 site. A [separate module exists for DKAN-specific implementation](https://github.com/GetDKAN/open_data_schema_map_dkan). @@ -16,7 +16,7 @@ A schema is a list of field definitions, usually representing a community specif ### API -An API in this module is a configuration set that exposes a specific set of machine-readable data at a specific URL (known as the API's endpoint). This module allows you to create multiple APIs that you save as database records and/or export using [Features](http://drupal.org/project/features). An API record will contain: +An API in this module is a configuration set that exposes a specific set of machine-readable data at a specific URL (known as the API's endpoint). This module allows you to create multiple APIs that you save as database records and/or export using [Features](https://drupal.org/project/features). An API record will contain: * an endpoint URL * a schema (chosen from the available schemas provided by the additional modules as described above) diff --git a/dkan/docs/components/search.rst b/dkan/docs/components/search.rst index 9e1272ae1..b462e08b9 100644 --- a/dkan/docs/components/search.rst +++ b/dkan/docs/components/search.rst @@ -1,22 +1,22 @@ Search ====== -DKAN offers a faceted search similar to CKAN. This functionality is provided by the `Search API `_ and `Search API DB `_ modules. DKAN can easily be updated to use Apache Solr to power the search using the `Search API Solr `_ module. +DKAN offers a faceted search similar to CKAN. This functionality is provided by the `Search API `_ and `Search API DB `_ modules. DKAN can easily be updated to use Apache Solr to power the search using the `Search API Solr `_ module. Search API ---------- -The `Search API `_ module provides a framework for easily creating searches on any entity known to Drupal, using any kind of search engine. It incorporates facet support and the ability to use the Views module for displaying search results. +The `Search API `_ module provides a framework for easily creating searches on any entity known to Drupal, using any kind of search engine. It incorporates facet support and the ability to use the Views module for displaying search results. Apache Solr ----------- -`Search API Solr Search `_ provides a Solr backend for the Search API module, and delivers enterprise class, high performance search functionality. Apache Solr runs as a separate service from the web server and requires extra resources to integrate into your website. This can increase the price for hosting. Recommended for high traffic sites. +`Search API Solr Search `_ provides a Solr backend for the Search API module, and delivers enterprise class, high performance search functionality. Apache Solr runs as a separate service from the web server and requires extra resources to integrate into your website. This can increase the price for hosting. Recommended for high traffic sites. **Requirements:** -- `Search API module `_ -- `Search API Solr Search module `_ +- `Search API module `_ +- `Search API Solr Search module `_ - An `Apache Solr server `_ For further details see the `Search API Solr's handbook documentation `_. @@ -43,7 +43,7 @@ To switch from the native database to Solr simply: * Create or purchase a Solr instance * Install search_api_solr * Go to Configuration -> "Search API" then "Add server" -* Enter a server name and under "Service class" select "Solr service" +* Enter a server name and under "Service class" select "Solr service" .. image:: ../images/create_solr_server.png @@ -52,7 +52,7 @@ To switch from the native database to Solr simply: .. image:: ../images/create_solr_server1.jpg * Update the Dataset index to use the Solr server. - + - Go to ``admin/config/search/search_api`` - Select **Edit** on the datasets index - Select the solr server you just added @@ -78,6 +78,6 @@ To add spellcheck, simply install the `Search API Spellcheck `_ +PDFs, CSVs and other files attached to Resources can be searched by using the Tika library. This functionality is made possible with the `Search API Attachments module `_ .. tip:: See the `Search API Handbook `_ for more recipes and information. diff --git a/dkan/docs/installation/basic.rst b/dkan/docs/installation/basic.rst index 5a3387fa8..424145d3a 100644 --- a/dkan/docs/installation/basic.rst +++ b/dkan/docs/installation/basic.rst @@ -18,7 +18,7 @@ Repository `__ is a Drupal *installation profile*. To set up a working website using DKAN, you will need to acquire or build a full DKAN distribution of Drupal. -.. tip:: `DKAN Starter `_ is project +.. tip:: `DKAN Starter `_ is project containing a prebuilt version of DKAN and the tools `CivicActions `_ uses for our own implementations and deployments. Learn more advanced workflows in that project's @@ -70,7 +70,7 @@ is optimized to run on the Pantheon platform. You can build a DKAN site with a single click on Pantheon `here `__. (We also offer `one-click installation on -Acquia `__) +Acquia `__) Download and unzip `the latest version of the "DKAN DROPS" codebase `__ @@ -189,8 +189,8 @@ With the web installer a short congratulatory message and you’ll be prompted to access your new site. - Proceed to “\ `DKAN - Data - Management `__\ ” or “\ `DKAN - User - Management `__ ” next to continue + Management `__\ ” or “\ `DKAN - User + Management `__ ” next to continue setting up your new DKAN server. Install for development diff --git a/dkan/docs/introduction/catalog-basics.rst b/dkan/docs/introduction/catalog-basics.rst index 1e39eeceb..8b4dd18c4 100644 --- a/dkan/docs/introduction/catalog-basics.rst +++ b/dkan/docs/introduction/catalog-basics.rst @@ -10,7 +10,7 @@ Catalog The catalog is a wrapper containing information, sorted into datasets. A catalog should provide the answers to basic questions such as: "Who is providing this data?" and "Under what conditions?" -`DCAT `_ - an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web - recommends providing the following fields: catalog record, dataset, description, homepage, language, license, publisher, release date, rights, spatial, themes, title and update date. +`DCAT `_ - an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web - recommends providing the following fields: catalog record, dataset, description, homepage, language, license, publisher, release date, rights, spatial, themes, title and update date. .. _datasets: @@ -31,7 +31,7 @@ Resources are the actual files, APIs or links that are being shared. Resource ty Datasets and Resources within DKAN and CKAN ------------------------------------------- -The following images display how datasets and resources are structured within DKAN and CKAN. Screenshots are from `Data.gov `_ which is powered by CKAN. DKAN follows CKAN conventions where possible. +The following images display how datasets and resources are structured within DKAN and CKAN. Screenshots are from `Data.gov `_ which is powered by CKAN. DKAN follows CKAN conventions where possible. .. figure:: ../images/DatasetResourceDiagram2.png diff --git a/dkan/docs/introduction/catalog-features.md b/dkan/docs/introduction/catalog-features.md index c800360c6..bd26f6da9 100644 --- a/dkan/docs/introduction/catalog-features.md +++ b/dkan/docs/introduction/catalog-features.md @@ -2,13 +2,13 @@ ## Project Open Data Compliance -DKAN provides a "data.json" index to satisfy the US federal government's [Project Open Data](http://project-open-data.github.io/) requirements. More information about the "slash data" or "data.json" requirements can be found in POD's [Open Data Catalog Requirements](http://project-open-data.github.io/catalog) and [Common Core Metadata Schema](http://project-open-data.github.io/schema) pages. +DKAN provides a "data.json" index to satisfy the US federal government's [Project Open Data](https://project-open-data.github.io/) requirements. More information about the "slash data" or "data.json" requirements can be found in POD's [Open Data Catalog Requirements](https://project-open-data.github.io/catalog) and [Common Core Metadata Schema](https://project-open-data.github.io/schema) pages. -The exact mapping of data (specifically, Drupal data [tokens](https://www.drupal.org/project/token)) from your DKAN site to the data.json index can be customized using the [Open Data Schema Mapper](/dkan-developers/adding-or-update-fields-api-output). +The exact mapping of data (specifically, Drupal data [tokens](https://www.drupal.org/project/token)) from your DKAN site to the data.json index can be customized using the [Open Data Schema Mapper](/dkan-developers/adding-or-update-fields-api-output). ## DCAT-Compliant Markup -Project Open Data's [schema](http://project-open-data.github.io/schema) is based on the [DCAT open data vocabulary](http://www.w3.org/TR/vocab-dcat/). DKAN also provides RDF endpoints and RDFa markup for all Datasets following the [DCAT specification](http://www.w3.org/TR/vocab-dcat/). +Project Open Data's [schema](https://project-open-data.github.io/schema) is based on the [DCAT open data vocabulary](https://www.w3.org/TR/vocab-dcat/). DKAN also provides RDF endpoints and RDFa markup for all Datasets following the [DCAT specification](https://www.w3.org/TR/vocab-dcat/). ## Public Catalog Listing API, Based on CKAN -For exposing more and better-structured machine-readable metadata than Project Open Data's data.json allows for, DKAN also ships with a public API based heavily on [CKAN's](http://docs.ckan.org/en/latest/api/index.html). This includes APIs for viewing the contents of an entire catalog, as well as requesting the metadata for a single [dataset](/dkan-documentation/dkan-features/dataset-features). \ No newline at end of file +For exposing more and better-structured machine-readable metadata than Project Open Data's data.json allows for, DKAN also ships with a public API based heavily on [CKAN's](http://docs.ckan.org/en/latest/api/index.html). This includes APIs for viewing the contents of an entire catalog, as well as requesting the metadata for a single [dataset](/dkan-documentation/dkan-features/dataset-features). diff --git a/dkan/docs/introduction/dkan-ckan.md b/dkan/docs/introduction/dkan-ckan.md index 7f78be35e..58a918dba 100644 --- a/dkan/docs/introduction/dkan-ckan.md +++ b/dkan/docs/introduction/dkan-ckan.md @@ -1,6 +1,6 @@ # Comparing DKAN and CKAN -[CKAN](http://ckan.org) is an open data catalog that has powered many high-profile portals, including the main open data portals for both the [United Kingdom](http://data.gov.uk) and the [United States](http://data.gov), among others. The makers of DKAN have enjoyed contributing to and deploying CKAN. So why DKAN? +[CKAN](http://ckan.org) is an open data catalog that has powered many high-profile portals, including the main open data portals for both the [United Kingdom](https://data.gov.uk) and the [United States](https://data.gov), among others. The makers of DKAN have enjoyed contributing to and deploying CKAN. So why DKAN? Ultimately, DKAN is a complimentary offering to CKAN in the effort to make data more open and accessible. diff --git a/dkan/docs/introduction/dkan-sites.rst b/dkan/docs/introduction/dkan-sites.rst index 6f771e7df..22eb2c0a8 100644 --- a/dkan/docs/introduction/dkan-sites.rst +++ b/dkan/docs/introduction/dkan-sites.rst @@ -25,16 +25,16 @@ United States of America ================================================== ============= Organization URL ================================================== ============= -U.S. Department of Health and Human Services (USA) http://healthdata.gov -National Democratic Institute http://nditech.org/project/dkan -USDA National Agricultural Library http://data.nal.usda.gov -California http://data.ca.gov -Oklahoma http://data.ok.gov -North Dakota http://gishubdata.nd.gov/ -Georgia (Governor's Office of Student Achievement) http://schoolgrades.ga.gov -Massachusetts http://docs.digital.mass.gov -Nebraska http://nebraskamap.gov/ -Louisville, KY http://data.louisvilleky.gov +U.S. Department of Health and Human Services (USA) https://healthdata.gov +National Democratic Institute https://nditech.org/project/dkan +USDA National Agricultural Library https://data.nal.usda.gov +California https://data.ca.gov +Oklahoma https://data.ok.gov +North Dakota https://gishubdata.nd.gov +Georgia (Governor's Office of Student Achievement) https://schoolgrades.georgia.gov +Massachusetts https://docs.digital.mass.gov/ +Nebraska https://nebraskamap.gov/ +Louisville, KY https://data.louisvilleky.gov OpenOakland http://data.openoakland.org DigitalC http://civicinsights.org ================================================== ============= @@ -51,11 +51,11 @@ Marine Scotland, UK http://marinedata.scotla Detail Data Northern Ireland, UK http://data.nicva.org UK Financial Conduct Authority Internal site - no public access Bank of England Internal site - no public access -Bonn, Germany http://opendata.bonn.de -Cologne, Germany http://offenedaten-koeln.de -Mülheim an der Ruhr, Germany http://geo.muelheim-ruhr.de -Bielefeld University, Germany http://dszbo-portal.uni-bielefeld.de -Wuppertal, Germany http://offenedaten-wuppertal.de +Bonn, Germany https://opendata.bonn.de +Cologne, Germany https://offenedaten-koeln.de +Mülheim an der Ruhr, Germany https://geo.muelheim-ruhr.de +Bielefeld University, Germany https://dszbo-portal.uni-bielefeld.de +Wuppertal, Germany https://offenedaten-wuppertal.de RNV, Germany http://opendata.rnv-online.de KDZV Frechen Rhein Erft Rur, Germany http://offenedaten.kdvz-frechen.de Montpellier, France http://data.montpellier3m.fr diff --git a/dkan/docs/releases/notes/1.13.1.rst b/dkan/docs/releases/notes/1.13.1.rst index e448500b8..6b9d85b8a 100644 --- a/dkan/docs/releases/notes/1.13.1.rst +++ b/dkan/docs/releases/notes/1.13.1.rst @@ -11,7 +11,7 @@ Improvements in this release - Fix validation page permission check using wrong permission name `odsm `_. - Fixed a bug in the `home page conversion function `_ - Fixed the page title (````) so that it's just the site name (not the node or panel title) -- Updated the DKAN API link on dataset pages to use the new `documentation site page <http://docs.getdkan.com/en/latest/apis/index.html>`_. +- Updated the DKAN API link on dataset pages to use the new `documentation site page <https://docs.getdkan.com/en/latest/apis/index.html>`_. - Fixed error messages appearing on homepage after upgrade - Fixed panelizer permissions to hide the "Customize Display" button for Site Managers. - Additional minor bug fixes to code and tests diff --git a/dkan/docs/releases/notes/1.13.3.rst b/dkan/docs/releases/notes/1.13.3.rst index aef349397..477bf7841 100644 --- a/dkan/docs/releases/notes/1.13.3.rst +++ b/dkan/docs/releases/notes/1.13.3.rst @@ -8,7 +8,7 @@ Improvements in this release - Groups permissions were given better logic. Editors will now become administrators of any group they are added to, giving them permission to edit or moderate any content in that group. Also, Site Manager was given permissions to edit the order of featured groups. -- We now provide parsing options on the `Datastore Fast Import <http://docs.getdkan.com/en/latest/components/datastore.html#using-the-fast-import-option>`_. This means a user can set what delimiters and line terminators are used when importing a CSV file, avoiding some import errors users were experiencing. +- We now provide parsing options on the `Datastore Fast Import <https://docs.getdkan.com/en/latest/components/datastore.html#using-the-fast-import-option>`_. This means a user can set what delimiters and line terminators are used when importing a CSV file, avoiding some import errors users were experiencing. - Some errors were fixed that caused installing DKAN with the browser (using /install.php rather than drush). Also, special characters were removed from default content filenames, fixing an installation bug on Windows systems. diff --git a/dkan/docs/releases/notes/1.13.md b/dkan/docs/releases/notes/1.13.md index 6bac9726f..73187c985 100644 --- a/dkan/docs/releases/notes/1.13.md +++ b/dkan/docs/releases/notes/1.13.md @@ -12,17 +12,17 @@ DKAN's new Harvest module gives DKAN administrators and site managers the abilit DKAN Harvest is fully configurable via the DKAN web interface. Harvest sources can be added like any other type of content, and data can be overridden or manipulated before being published. Migrations can be managed via an intuitive dashboard interface or triggered with a cron job. -Get more details on DKAN Harvest by reading its [documentation pages](http://docs.getdkan.com/en/latest/components/harvest.html). +Get more details on DKAN Harvest by reading its [documentation pages](https://docs.getdkan.com/en/latest/components/harvest.html). ### DKAN Dataset REST API Previous DKAN APIs have been read-only and focused on CKAN compatibility. A new RESTful API for DKAN datasets provides an endpoint that allows other applications to interact with DKAN, including creating and modifying datasets and resources. -Get more details on the [Dataset REST API](http://docs.getdkan.com/en/latest/apis/rest-api.html). +Get more details on the [Dataset REST API](https://docs.getdkan.com/en/latest/apis/rest-api.html). ### DCAT-AP Compliance -DKAN's DCAT RDF publishing has been re-engineered to be more consistent with its other open-data standards implementation, and, more importantly, to implement the new DCAT-AP protocol. DKAN's fields can be easily mapped to DCAT-AP fields using the [Open Data Schema Mapper](http://docs.getdkan.com/en/latest/components/open-data-schema.html). Now, DKAN meets US standards (Project Open Data) as well as European Union standards (DCAT-AP). +DKAN's DCAT RDF publishing has been re-engineered to be more consistent with its other open-data standards implementation, and, more importantly, to implement the new DCAT-AP protocol. DKAN's fields can be easily mapped to DCAT-AP fields using the [Open Data Schema Mapper](https://docs.getdkan.com/en/latest/components/open-data-schema.html). Now, DKAN meets US standards (Project Open Data) as well as European Union standards (DCAT-AP). ### New Default Content @@ -61,7 +61,7 @@ Project Open Data (POD) sets a standard for the information about datasets (meta We've moved this module into core DKAN so that it's part of every install, though not enabled by default. When enabled, the ODFE module makes federal agencies compliant with POD standards. -Get more details on [Federal Extras](http://docs.getdkan.com/en/latest/components/federal-extras.html) on DKAN. +Get more details on [Federal Extras](https://docs.getdkan.com/en/latest/components/federal-extras.html) on DKAN. ### In-place Editor for Site Managers + look and feel @@ -77,7 +77,7 @@ Improvements to Data Previews also offer better support for Resources that are h The DKAN Datastore API makes it possible to query for contents of Resources uploaded to the Datastore as detailed as a cell within a table. The improved Datastore API is enhanced to open greater possibilities of requesting complex queries from contents within a Datastore on a DKAN site as well as multiple queries in a single request. -Get more details on the [Datastore API](http://docs.getdkan.com/en/latest/apis/datastore-api.html) +Get more details on the [Datastore API](https://docs.getdkan.com/en/latest/apis/datastore-api.html) ### New Dataset fields added @@ -130,7 +130,7 @@ Some DKAN features weren't working as expected and causing issues. We fixed thos ### Removing EVA module -**WARNING:** The [EVA](http://drupal.org/project/eva) is removed with this release. If you are using EVA in your project you need to add it to your `sites/all/modules` folder. +**WARNING:** The [EVA](https://drupal.org/project/eva) is removed with this release. If you are using EVA in your project you need to add it to your `sites/all/modules` folder. One view previously used EVA, `user_profile_search`. You can avoid an error by reverting the feature `dkan_sitewide_user`. Note that we recommend reverting all features `drush fra -y` for the upgrade. @@ -155,7 +155,7 @@ drush rr ## New Documentation location -We have moved DKAN's technical documentation from the Drupal-based site where it used to live to the /docs folder within the main DKAN repo. Documentation changes will now be part of code commits and pull requests. The documentation is built on [ReadTheDocs](https://readthedocs.org), but lives at the same URL as the old site: http://docs.getdkan.com/ +We have moved DKAN's technical documentation from the Drupal-based site where it used to live to the /docs folder within the main DKAN repo. Documentation changes will now be part of code commits and pull requests. The documentation is built on [ReadTheDocs](https://readthedocs.org), but lives at the same URL as the old site: https://docs.getdkan.com/ ## Special Notes diff --git a/dkan/docs/scratch/googleanalytics.md b/dkan/docs/scratch/googleanalytics.md index 986f57090..fa1b9dff7 100644 --- a/dkan/docs/scratch/googleanalytics.md +++ b/dkan/docs/scratch/googleanalytics.md @@ -1,8 +1,8 @@ # Google Analytics Reports -It is easy to create custom reports to access information specifically useful for DKAN sites. Once you have <a href="http://drupal.org/project/google_analytics">installed the Google Analytics module</a> and added your tracking code you are ready to begin. +It is easy to create custom reports to access information specifically useful for DKAN sites. Once you have <a href="https://drupal.org/project/google_analytics">installed the Google Analytics module</a> and added your tracking code you are ready to begin. -The following will create reports that provide details on popular datasets and resources as well as file downloads. +The following will create reports that provide details on popular datasets and resources as well as file downloads. ## Datasets and Resources Report 1. Login to Google Analytics and go to your DKAN web site overview @@ -16,7 +16,7 @@ The following will create reports that provide details on popular datasets and r 5. Add "Metric Group" of "Pageviews" and "Dimension Drilldowns" of "Page" 6. Add "Filters" to include "dataset" and "exclude" resource. This will make a selection for ONLY datasets and not their associated resources -![drill downs] (http://docs.getdkan.com/sites/default/files/Screen%20Shot%202014-12-16%20at%2012.58.54%20PM.png) +![drill downs](https://docs.getdkan.com/sites/default/files/Screen%20Shot%202014-12-16%20at%2012.58.54%20PM.png) 7. Add "Resources" tab @@ -24,13 +24,13 @@ The following will create reports that provide details on popular datasets and r 9. Add "Filters" to include "dataset/*/resource". This will make a selection for ONLY resources and not their associated datasets -![resources](http://docs.getdkan.com/sites/default/files/Screen%20Shot%202014-12-16%20at%201.02.25%20PM.png) +![resources](https://docs.getdkan.com/sites/default/files/Screen%20Shot%202014-12-16%20at%201.02.25%20PM.png) ## Files Report The Drupal Google Analytics module automatically tracks file downloads. To access and customize this report take the following steps. 1. Click "Behavior" -> "Events" -> "Overview" -> "Downloads" -![file download reports](http://docs.getdkan.com/sites/default/files/Screen%20Shot%202014-12-16%20at%201.06.54%20PM.png) +![file download reports](https://docs.getdkan.com/sites/default/files/Screen%20Shot%202014-12-16%20at%201.06.54%20PM.png) -2. This will provide a report with all file downloads. To add to the "Custom Reports" list or customize for specific file types click "Customize". \ No newline at end of file +2. This will provide a report with all file downloads. To add to the "Custom Reports" list or customize for specific file types click "Customize". diff --git a/dkan/docs/scratch/viz-entity.md b/dkan/docs/scratch/viz-entity.md index 1ef61e901..278770f17 100644 --- a/dkan/docs/scratch/viz-entity.md +++ b/dkan/docs/scratch/viz-entity.md @@ -1,6 +1,6 @@ # The Visualization Entity -You may also refer to the [Visualization Entity specific ReadTheDocs site.](http://visualization-entity.readthedocs.io/en/latest/) +You may also refer to the [Visualization Entity specific ReadTheDocs site.](https://visualization-entity.readthedocs.io/en/latest/) The <a href="https://github.com/GetDKAN/visualization_entity">Visualization Entity</a> module provides a suite of options for creating visualizations in DKAN that used natively or embedded in other sites. @@ -8,16 +8,16 @@ This module is under development. Documentation will be updated as the module is ### The Visualization Entity module provides the following types of visualizations: -* Charts and Graphs +* Charts and Graphs * [More information](https://github.com/GetDKAN/visualization_entity_charts) (Under development) * Choropleth maps - * [More information]( http://visualization-entity.readthedocs.org/en/latest/create-a-choropleth-visualization/) + * [More information]( https://visualization-entity.readthedocs.org/en/latest/create-a-choropleth-visualization/) * I-Frame embedded content (Coming soon) -* GeoJSON based maps (Coming soon) - * [More information](http://visualization-entity.readthedocs.org/en/latest/create-a-geojson-visualization/) +* GeoJSON based maps (Coming soon) + * [More information](https://visualization-entity.readthedocs.org/en/latest/create-a-geojson-visualization/) ## How to create a chart: @@ -41,15 +41,15 @@ This module is under development. Documentation will be updated as the module is ![Choosing the file source][Choosing the file source] -4. Click the ‘Next’ button. If the file or URL loaded properly, you will be able to fill out two fields beneath the title "Define Variables." +4. Click the ‘Next’ button. If the file or URL loaded properly, you will be able to fill out two fields beneath the title "Define Variables." -The first one, **Series**, determines the **Y axis**, and the second field, **X-Field**, determines the X axis. In these fields, you may choose the columns that you are going to display. Only the Series field can contain multiple values. +The first one, **Series**, determines the **Y axis**, and the second field, **X-Field**, determines the X axis. In these fields, you may choose the columns that you are going to display. Only the Series field can contain multiple values. If the column names are not displayed properly, check again that your source URL was correct. -5. Click the Next button. +5. Click the Next button. -7. Select the type of chart you want to create and click Next once more. At this point, you will see a preview of your chart. +7. Select the type of chart you want to create and click Next once more. At this point, you will see a preview of your chart. ![Selecting your chart type][Selecting your chart type] @@ -63,7 +63,7 @@ If the column names are not displayed properly, check again that your source URL 1. Navigate to the dataset that will be used for the map. -2. Click **Explore Data**. +2. Click **Explore Data**. 3. Right-click (ctrl-click on Mac) the **Download** button to copy the URL of the resource file. @@ -75,7 +75,7 @@ If the column names are not displayed properly, check again that your source URL 7. Click Next. -8. If the URL was loaded properly you will be able to select the columns where your geographic data is. It might be in two columns (Latitude and Longitude fields), or in a single field (Geo Point field). If the column names are not displayed properly, check again that your source URL was correct. +8. If the URL was loaded properly you will be able to select the columns where your geographic data is. It might be in two columns (Latitude and Longitude fields), or in a single field (Geo Point field). If the column names are not displayed properly, check again that your source URL was correct. 9. Click the ‘Finish’ button @@ -96,9 +96,9 @@ Tables allow you to display a preview of the data as it would be seen when openi 5. Click Save. <!-- Images --> -[Navigating to Structure -> Entity Types -> Visualizations -> Charts]: http://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%204.50.31%20PM.png -[Alt]: http://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%204.50.31%20PM.png -[Uploading a file to Charts]: http://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.07.22%20PM_0.png -[Resource name autocomplete]: http://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.37.49%20PM.png -[Choosing the file source]: http://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.38.39%20PM.png -[Selecting your chart type]: http://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.53.59%20PM.png +[Navigating to Structure -> Entity Types -> Visualizations -> Charts]: https://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%204.50.31%20PM.png +[Alt]: https://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%204.50.31%20PM.png +[Uploading a file to Charts]: https://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.07.22%20PM_0.png +[Resource name autocomplete]: https://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.37.49%20PM.png +[Choosing the file source]: https://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.38.39%20PM.png +[Selecting your chart type]: https://docs.getdkan.com/sites/default/files/Screen%20Shot%202016-01-21%20at%205.53.59%20PM.png diff --git a/dkan/drupal-org-core.make b/dkan/drupal-org-core.make index ad71e6993..d95554158 100644 --- a/dkan/drupal-org-core.make +++ b/dkan/drupal-org-core.make @@ -3,10 +3,10 @@ core: 7.x projects: drupal: type: core - version: '7.58' + version: '7.59' # Use vocabulary machine name for permissions, see http://drupal.org/node/995156 patch: - 995156: 'http://drupal.org/files/issues/995156-5_portable_taxonomy_permissions.patch' + 995156: 'https://drupal.org/files/issues/995156-5_portable_taxonomy_permissions.patch' # Notice: Undefined index: #field_name in file_managed_file_save_upload() 1903010: 'https://www.drupal.org/files/issues/drupal-undefinedindex_fileupload-1903010-4.patch' # Warning: filesize(): stat failed diff --git a/dkan/drupal-org.make b/dkan/drupal-org.make index 14a65a77e..818763417 100644 --- a/dkan/drupal-org.make +++ b/dkan/drupal-org.make @@ -26,11 +26,11 @@ projects: beautytips: download: type: git - url: http://git.drupal.org/project/beautytips.git + url: https://git.drupal.org/project/beautytips.git branch: 7.x-2.x revision: f9a8b5b patch: - 849232: http://drupal.org/files/include-excanvas-via-libraries-api-d7-849232-13.patch + 849232: https://drupal.org/files/include-excanvas-via-libraries-api-d7-849232-13.patch better_exposed_filters: version: '3.5' bueditor: @@ -101,7 +101,7 @@ projects: feeds: download: type: git - url: http://git.drupal.org/project/feeds.git + url: https://git.drupal.org/project/feeds.git branch: 7.x-2.x revision: d312f4f66e98cc12b8462cd13874184589017f72 patch: @@ -109,12 +109,12 @@ projects: feeds_field_fetcher: download: type: git - url: http://git.drupal.org/project/feeds_field_fetcher.git + url: https://git.drupal.org/project/feeds_field_fetcher.git branch: 7.x-1.x revision: 6725b86 patch: - 2315425: http://www.drupal.org/files/issues/feeds_field_fetcher-typo-error-2315425-1.patch - 2829416: http://www.drupal.org/files/issues/feeds_field_fetcher_error-validation-config.patch + 2315425: https://www.drupal.org/files/issues/feeds_field_fetcher-typo-error-2315425-1.patch + 2829416: https://www.drupal.org/files/issues/feeds_field_fetcher_error-validation-config.patch feeds_flatstore_processor: download: type: git @@ -123,7 +123,7 @@ projects: field_group: version: '1.5' patch: - 2042681: http://drupal.org/files/issues/field-group-show-ajax-2042681-8.patch + 2042681: https://drupal.org/files/issues/field-group-show-ajax-2042681-8.patch 2831815: https://www.drupal.org/files/issues/hash-location-sanitization.diff field_group_table: version: '1.6' @@ -166,11 +166,11 @@ projects: gravatar: download: type: git - url: http://git.drupal.org/project/gravatar.git + url: https://git.drupal.org/project/gravatar.git branch: 7.x-1.x revision: bb2f81e patch: - 1568162: http://drupal.org/files/views-display-user-picture-doesn-t-display-gravatar-1568162-10.patch + 1568162: https://drupal.org/files/views-display-user-picture-doesn-t-display-gravatar-1568162-10.patch honeypot: version: '1.22' image_url_formatter: @@ -180,7 +180,7 @@ projects: type: module download: type: git - url: http://git.drupal.org/project/imagecache_actions.git + url: https://git.drupal.org/project/imagecache_actions.git revision: cd19d2a job_scheduler: version: 2.x @@ -199,6 +199,14 @@ projects: version: '1.1' link_iframe_formatter: version: '1.1' + linkchecker: + download: + type: git + url: 'https://git.drupal.org/project/linkchecker.git' + revision: 623819d04464b26af8e216113a88cd03f4bb4ccc + patch: + 965720: https://www.drupal.org/files/issues/linkchecker-views-integration-965720-124.patch + 1: patches/dkan_linkchecker_file.patch manualcrop: version: '1.6' markdown: @@ -206,9 +214,9 @@ projects: markdowneditor: version: '1.4' patch: - 2045225: http://drupal.org/files/remove-dsm-from-hook-install-2045225-1.patch + 2045225: https://drupal.org/files/remove-dsm-from-hook-install-2045225-1.patch media: - version: 2.13 + version: 2.19 media_youtube: version: '3.5' media_vimeo: @@ -232,12 +240,12 @@ projects: multistep: download: type: git - url: http://git.drupal.org/project/multistep.git + url: https://git.drupal.org/project/multistep.git revision: 3b0d40a og: version: '2.9' patch: - 1090438: http://drupal.org/files/issues/og-add_users_and_entities_with_drush-1090438-12.patch + 1090438: https://drupal.org/files/issues/og-add_users_and_entities_with_drush-1090438-12.patch 2549071: https://www.drupal.org/files/issues/og_actions-bug-vbo-delete.patch 2301831: https://www.drupal.org/files/issues/og-missing-permission-roles-2301831-1.patch og_extras: @@ -282,7 +290,7 @@ projects: ref_field: download: type: git - url: http://git.drupal.org/project/ref_field.git + url: https://git.drupal.org/project/ref_field.git revision: 9dbf7cf patch: 2360019: https://www.drupal.org/files/issues/ref_field-delete-insert-warning-2360019-5.patch @@ -341,8 +349,8 @@ projects: views_autocomplete_filters: version: '1.2' patch: - 2374709: http://www.drupal.org/files/issues/views_autocomplete_filters-cache-2374709-2.patch - 2317351: http://www.drupal.org/files/issues/views_autocomplete_filters-content-pane-2317351-4.patch + 2374709: https://www.drupal.org/files/issues/views_autocomplete_filters-cache-2374709-2.patch + 2317351: https://www.drupal.org/files/issues/views_autocomplete_filters-content-pane-2317351-4.patch views_bulk_operations: version: '3.4' views_responsive_grid: diff --git a/dkan/import/rdf.php b/dkan/import/rdf.php index 24b744190..95dd12da8 100644 --- a/dkan/import/rdf.php +++ b/dkan/import/rdf.php @@ -1,5 +1,10 @@ <?php -$dcat = unserialize('a:5:{s:3:"uri";s:26:"http://www.w3.org/ns/dcat#";s:5:"title";a:0:{}s:11:"description";a:0:{}s:5:"terms";a:4:{s:10:"rdfs_class";a:13:{s:33:"http://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"http://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"http://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"http://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"http://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"http://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"http://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"http://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"http://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/dcmitype/Dataset";a:5:{s:3:"uri";s:35:"http://purl.org/dc/dcmitype/Dataset";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:45:"http://www.w3.org/2000/01/rdf-schema#Resource";a:5:{s:3:"uri";s:45:"http://www.w3.org/2000/01/rdf-schema#Resource";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://www.w3.org/2001/XMLSchema#integer";a:5:{s:3:"uri";s:40:"http://www.w3.org/2001/XMLSchema#integer";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:43:"http://www.w3.org/2004/02/skos/core#Concept";a:5:{s:3:"uri";s:43:"http://www.w3.org/2004/02/skos/core#Concept";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:49:"http://www.w3.org/2004/02/skos/core#ConceptScheme";a:5:{s:3:"uri";s:49:"http://www.w3.org/2004/02/skos/core#ConceptScheme";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:9:"owl_class";a:7:{s:33:"http://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"http://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"http://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"http://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"http://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"http://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"http://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"http://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"http://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:14:{s:35:"http://www.w3.org/ns/dcat#accessURL";a:7:{s:3:"uri";s:35:"http://www.w3.org/ns/dcat#accessURL";s:5:"label";a:1:{s:3:"und";s:10:"access URL";}s:7:"comment";a:1:{s:3:"und";s:245:"points to the location of a distribution. This can be a direct download link, a link to an HTML page containing a link to the actual data, Feed, Web Service etc. the semantic is determined by its domain (Distribution, Feed, WebService, Download)";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:45:"http://www.w3.org/2000/01/rdf-schema#Resource";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"http://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"http://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://www.w3.org/ns/dcat#dataDictionary";a:7:{s:3:"uri";s:40:"http://www.w3.org/ns/dcat#dataDictionary";s:5:"label";a:1:{s:3:"und";s:15:"data dictionary";}s:7:"comment";a:1:{s:3:"und";s:64:"links a dataset to a dictionary that helps interpreting the data";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://www.w3.org/ns/dcat#dataQuality";a:7:{s:3:"uri";s:37:"http://www.w3.org/ns/dcat#dataQuality";s:5:"label";a:1:{s:3:"und";s:12:"data quality";}s:7:"comment";a:1:{s:3:"und";s:185:"describes the quality of data e.g. precision. This should not be used to describe the data collection characteristics, other more specialized statistical properties can be used instead.";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"http://www.w3.org/ns/dcat#dataset";a:7:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#dataset";s:5:"label";a:1:{s:3:"und";s:7:"dataset";}s:7:"comment";a:1:{s:3:"und";s:37:"a dataset that is part of the catalog";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://www.w3.org/ns/dcat#distribution";a:7:{s:3:"uri";s:38:"http://www.w3.org/ns/dcat#distribution";s:5:"label";a:1:{s:3:"und";s:12:"distribution";}s:7:"comment";a:1:{s:3:"und";s:56:"connects a dataset to one of its available distributions";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://www.w3.org/ns/dcat#granularity";a:7:{s:3:"uri";s:37:"http://www.w3.org/ns/dcat#granularity";s:5:"label";a:1:{s:3:"und";s:11:"granularity";}s:7:"comment";a:1:{s:3:"und";s:98:"describes the level of granularity of data in a dataset. The granularity can be in time, place etc";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"http://www.w3.org/ns/dcat#keyword";a:7:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#keyword";s:5:"label";a:1:{s:3:"und";s:7:"keyword";}s:7:"comment";a:1:{s:3:"und";s:38:"a keyword or tag describing the datase";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:32:"http://www.w3.org/ns/dcat#record";a:7:{s:3:"uri";s:32:"http://www.w3.org/ns/dcat#record";s:5:"label";a:1:{s:3:"und";s:6:"record";}s:7:"comment";a:1:{s:3:"und";s:30:"links a catalog to its records";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:39:"http://www.w3.org/ns/dcat#CatalogRecord";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:30:"http://www.w3.org/ns/dcat#size";a:7:{s:3:"uri";s:30:"http://www.w3.org/ns/dcat#size";s:5:"label";a:1:{s:3:"und";s:4:"size";}s:7:"comment";a:1:{s:3:"und";s:26:"the size of a distribution";}s:6:"domain";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:31:"http://purl.org/dc/terms/extent";}s:7:"inverse";a:0:{}}s:31:"http://www.w3.org/ns/dcat#theme";a:7:{s:3:"uri";s:31:"http://www.w3.org/ns/dcat#theme";s:5:"label";a:1:{s:3:"und";s:5:"theme";}s:7:"comment";a:1:{s:3:"und";s:68:"the main category of the dataset. A dataset can have multiple themes";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:43:"http://www.w3.org/2004/02/skos/core#Concept";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:39:"http://www.w3.org/ns/dcat#themeTaxonomy";a:7:{s:3:"uri";s:39:"http://www.w3.org/ns/dcat#themeTaxonomy";s:5:"label";a:1:{s:3:"und";s:6:"themes";}s:7:"comment";a:1:{s:3:"und";s:74:"the knowledge organization system (KOS) used to classify catalogs datasets";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:49:"http://www.w3.org/2004/02/skos/core#ConceptScheme";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}s:21:"owl_property_datatype";a:1:{s:31:"http://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"http://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"http://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:5:{s:3:"xml";s:36:"http://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"http://www.w3.org/1999/02/22-rdf-syntax-ns#";i:0;s:37:"http://www.w3.org/2000/01/rdf-schema#";s:3:"dct";s:25:"http://purl.org/dc/terms/";s:3:"owl";s:30:"http://www.w3.org/2002/07/owl#";}}'); +/** + * @file + * RDF. + */ -$dc = unserialize('a:5:{s:3:"uri";s:25:"http://purl.org/dc/terms/";s:5:"title";a:1:{s:2:"en";s:27:"DCMI Metadata Terms - other";}s:11:"description";a:0:{}s:5:"terms";a:2:{s:10:"rdfs_class";a:25:{s:30:"http://purl.org/dc/terms/Agent";a:5:{s:3:"uri";s:30:"http://purl.org/dc/terms/Agent";s:5:"label";a:1:{s:2:"en";s:5:"Agent";}s:7:"comment";a:1:{s:2:"en";s:45:"A resource that acts or has the power to act.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/AgentClass";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/AgentClass";s:5:"label";a:1:{s:2:"en";s:11:"Agent Class";}s:7:"comment";a:1:{s:2:"en";s:18:"A group of agents.";}s:10:"superclass";a:1:{i:0;s:42:"http://www.w3.org/2000/01/rdf-schema#Class";}s:8:"disjoint";a:0:{}}s:46:"http://purl.org/dc/terms/BibliographicResource";a:5:{s:3:"uri";s:46:"http://purl.org/dc/terms/BibliographicResource";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Resource";}s:7:"comment";a:1:{s:2:"en";s:47:"A book, article, or other documentary resource.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/FileFormat";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/FileFormat";s:5:"label";a:1:{s:2:"en";s:11:"File Format";}s:7:"comment";a:1:{s:2:"en";s:26:"A digital resource format.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/Frequency";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/Frequency";s:5:"label";a:1:{s:2:"en";s:9:"Frequency";}s:7:"comment";a:1:{s:2:"en";s:33:"A rate at which something recurs.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/Jurisdiction";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/Jurisdiction";s:5:"label";a:1:{s:2:"en";s:12:"Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:69:"The extent or range of judicial, law enforcement, or other authority.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/LicenseDocument";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/LicenseDocument";s:5:"label";a:1:{s:2:"en";s:16:"License Document";}s:7:"comment";a:1:{s:2:"en";s:76:"A legal document giving official permission to do something with a Resource.";}s:10:"superclass";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/LinguisticSystem";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/LinguisticSystem";s:5:"label";a:1:{s:2:"en";s:17:"Linguistic System";}s:7:"comment";a:1:{s:2:"en";s:77:"A system of signs, symbols, sounds, gestures, or rules used in communication.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Location";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Location";s:5:"label";a:1:{s:2:"en";s:8:"Location";}s:7:"comment";a:1:{s:2:"en";s:32:"A spatial region or named place.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";a:5:{s:3:"uri";s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";s:5:"label";a:1:{s:2:"en";s:33:"Location, Period, or Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:44:"A location, period of time, or jurisdiction.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/MediaType";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/MediaType";s:5:"label";a:1:{s:2:"en";s:10:"Media Type";}s:7:"comment";a:1:{s:2:"en";s:33:"A file format or physical medium.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";a:5:{s:3:"uri";s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";s:5:"label";a:1:{s:2:"en";s:20:"Media Type or Extent";}s:7:"comment";a:1:{s:2:"en";s:23:"A media type or extent.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/MethodOfInstruction";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/MethodOfInstruction";s:5:"label";a:1:{s:2:"en";s:21:"Method of Instruction";}s:7:"comment";a:1:{s:2:"en";s:68:"A process that is used to engender knowledge, attitudes, and skills.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/MethodOfAccrual";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/MethodOfAccrual";s:5:"label";a:1:{s:2:"en";s:17:"Method of Accrual";}s:7:"comment";a:1:{s:2:"en";s:54:"A method by which resources are added to a collection.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/PeriodOfTime";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/PeriodOfTime";s:5:"label";a:1:{s:2:"en";s:14:"Period of Time";}s:7:"comment";a:1:{s:2:"en";s:72:"An interval of time that is named or defined by its start and end dates.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/PhysicalMedium";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/PhysicalMedium";s:5:"label";a:1:{s:2:"en";s:15:"Physical Medium";}s:7:"comment";a:1:{s:2:"en";s:31:"A physical material or carrier.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/PhysicalResource";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/PhysicalResource";s:5:"label";a:1:{s:2:"en";s:17:"Physical Resource";}s:7:"comment";a:1:{s:2:"en";s:17:"A material thing.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:31:"http://purl.org/dc/terms/Policy";a:5:{s:3:"uri";s:31:"http://purl.org/dc/terms/Policy";s:5:"label";a:1:{s:2:"en";s:6:"Policy";}s:7:"comment";a:1:{s:2:"en";s:118:"A plan or course of action by an authority, intended to influence and determine decisions, actions, and other matters.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/ProvenanceStatement";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/ProvenanceStatement";s:5:"label";a:1:{s:2:"en";s:20:"Provenance Statement";}s:7:"comment";a:1:{s:2:"en";s:158:"A statement of any changes in ownership and custody of a resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/RightsStatement";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/RightsStatement";s:5:"label";a:1:{s:2:"en";s:16:"Rights Statement";}s:7:"comment";a:1:{s:2:"en";s:197:"A statement about the intellectual property rights (IPR) held in or over a Resource, a legal document giving official permission to do something with a resource, or a statement about access rights.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/SizeOrDuration";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/SizeOrDuration";s:5:"label";a:1:{s:2:"en";s:16:"Size or Duration";}s:7:"comment";a:1:{s:2:"en";s:58:"A dimension or extent, or a time taken to play or execute.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Standard";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Standard";s:5:"label";a:1:{s:2:"en";s:8:"Standard";}s:7:"comment";a:1:{s:2:"en";s:86:"A basis for comparison; a reference point against which other things can be evaluated.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:42:"http://www.w3.org/2000/01/rdf-schema#Class";a:5:{s:3:"uri";s:42:"http://www.w3.org/2000/01/rdf-schema#Class";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:38:"http://purl.org/dc/dcmitype/Collection";a:5:{s:3:"uri";s:38:"http://purl.org/dc/dcmitype/Collection";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:71:{s:30:"http://purl.org/dc/terms/title";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/title";s:5:"label";a:1:{s:2:"en";s:5:"Title";}s:7:"comment";a:1:{s:2:"en";s:29:"A name given to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/creator";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/creator";s:5:"label";a:1:{s:2:"en";s:7:"Creator";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity primarily responsible for making the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:2:{i:0;s:39:"http://purl.org/dc/elements/1.1/creator";i:1;s:36:"http://purl.org/dc/terms/contributor";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:1:{s:2:"en";s:7:"Subject";}s:7:"comment";a:1:{s:2:"en";s:26:"The topic of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:39:"http://purl.org/dc/elements/1.1/subject";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/description";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/description";s:5:"label";a:1:{s:2:"en";s:11:"Description";}s:7:"comment";a:1:{s:2:"en";s:27:"An account of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/publisher";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/publisher";s:5:"label";a:1:{s:2:"en";s:9:"Publisher";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity responsible for making the resource available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:41:"http://purl.org/dc/elements/1.1/publisher";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/contributor";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/contributor";s:5:"label";a:1:{s:2:"en";s:11:"Contributor";}s:7:"comment";a:1:{s:2:"en";s:63:"An entity responsible for making contributions to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/contributor";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/date";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/date";s:5:"label";a:1:{s:2:"en";s:4:"Date";}s:7:"comment";a:1:{s:2:"en";s:84:"A point or period of time associated with an event in the lifecycle of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/type";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/type";s:5:"label";a:1:{s:2:"en";s:4:"Type";}s:7:"comment";a:1:{s:2:"en";s:36:"The nature or genre of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"http://www.w3.org/2000/01/rdf-schema#Class";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/type";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/format";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/format";s:5:"label";a:1:{s:2:"en";s:6:"Format";}s:7:"comment";a:1:{s:2:"en";s:64:"The file format, physical medium, or dimensions of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/identifier";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/identifier";s:5:"label";a:1:{s:2:"en";s:10:"Identifier";}s:7:"comment";a:1:{s:2:"en";s:64:"An unambiguous reference to the resource within a given context.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/source";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/source";s:5:"label";a:1:{s:2:"en";s:6:"Source";}s:7:"comment";a:1:{s:2:"en";s:64:"A related resource from which the described resource is derived.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/source";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/language";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/language";s:5:"label";a:1:{s:2:"en";s:8:"Language";}s:7:"comment";a:1:{s:2:"en";s:27:"A language of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:41:"http://purl.org/dc/terms/LinguisticSystem";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/language";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/relation";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/relation";s:5:"label";a:1:{s:2:"en";s:8:"Relation";}s:7:"comment";a:1:{s:2:"en";s:19:"A related resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/coverage";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/coverage";s:5:"label";a:1:{s:2:"en";s:8:"Coverage";}s:7:"comment";a:1:{s:2:"en";s:147:"The spatial or temporal topic of the resource, the spatial applicability of the resource, or the jurisdiction under which the resource is relevant.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/rights";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/rights";s:5:"label";a:1:{s:2:"en";s:6:"Rights";}s:7:"comment";a:1:{s:2:"en";s:55:"Information about rights held in and over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/audience";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/audience";s:5:"label";a:1:{s:2:"en";s:8:"Audience";}s:7:"comment";a:1:{s:2:"en";s:62:"A class of entity for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/alternative";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/alternative";s:5:"label";a:1:{s:2:"en";s:17:"Alternative Title";}s:7:"comment";a:1:{s:2:"en";s:37:"An alternative name for the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";i:1;s:30:"http://purl.org/dc/terms/title";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/tableOfContents";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/tableOfContents";s:5:"label";a:1:{s:2:"en";s:17:"Table Of Contents";}s:7:"comment";a:1:{s:2:"en";s:35:"A list of subunits of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/abstract";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/abstract";s:5:"label";a:1:{s:2:"en";s:8:"Abstract";}s:7:"comment";a:1:{s:2:"en";s:26:"A summary of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/created";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/created";s:5:"label";a:1:{s:2:"en";s:12:"Date Created";}s:7:"comment";a:1:{s:2:"en";s:33:"Date of creation of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:30:"http://purl.org/dc/terms/valid";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/valid";s:5:"label";a:1:{s:2:"en";s:10:"Date Valid";}s:7:"comment";a:1:{s:2:"en";s:47:"Date (often a range) of validity of a resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/available";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/available";s:5:"label";a:1:{s:2:"en";s:14:"Date Available";}s:7:"comment";a:1:{s:2:"en";s:71:"Date (often a range) that the resource became or will become available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/issued";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/issued";s:5:"label";a:1:{s:2:"en";s:11:"Date Issued";}s:7:"comment";a:1:{s:2:"en";s:60:"Date of formal issuance (e.g., publication) of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/modified";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/modified";s:5:"label";a:1:{s:2:"en";s:13:"Date Modified";}s:7:"comment";a:1:{s:2:"en";s:39:"Date on which the resource was changed.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:1:{s:2:"en";s:6:"Extent";}s:7:"comment";a:1:{s:2:"en";s:37:"The size or duration of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/SizeOrDuration";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/medium";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/medium";s:5:"label";a:1:{s:2:"en";s:6:"Medium";}s:7:"comment";a:1:{s:2:"en";s:49:"The material or physical carrier of the resource.";}s:6:"domain";a:1:{i:0;s:41:"http://purl.org/dc/terms/PhysicalResource";}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/PhysicalMedium";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/isVersionOf";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/isVersionOf";s:5:"label";a:1:{s:2:"en";s:13:"Is Version Of";}s:7:"comment";a:1:{s:2:"en";s:88:"A related resource of which the described resource is a version, edition, or adaptation.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/hasVersion";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/hasVersion";s:5:"label";a:1:{s:2:"en";s:11:"Has Version";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource that is a version, edition, or adaptation of the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isReplacedBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isReplacedBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Replaced By";}s:7:"comment";a:1:{s:2:"en";s:83:"A related resource that supplants, displaces, or supersedes the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/replaces";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/replaces";s:5:"label";a:1:{s:2:"en";s:8:"Replaces";}s:7:"comment";a:1:{s:2:"en";s:90:"A related resource that is supplanted, displaced, or superseded by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isRequiredBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isRequiredBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Required By";}s:7:"comment";a:1:{s:2:"en";s:104:"A related resource that requires the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/requires";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/requires";s:5:"label";a:1:{s:2:"en";s:8:"Requires";}s:7:"comment";a:1:{s:2:"en";s:110:"A related resource that is required by the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/isPartOf";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/isPartOf";s:5:"label";a:1:{s:2:"en";s:10:"Is Part Of";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource in which the described resource is physically or logically included.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/hasPart";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/hasPart";s:5:"label";a:1:{s:2:"en";s:8:"Has Part";}s:7:"comment";a:1:{s:2:"en";s:93:"A related resource that is included either physically or logically in the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/isReferencedBy";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/isReferencedBy";s:5:"label";a:1:{s:2:"en";s:16:"Is Referenced By";}s:7:"comment";a:1:{s:2:"en";s:89:"A related resource that references, cites, or otherwise points to the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/references";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/references";s:5:"label";a:1:{s:2:"en";s:10:"References";}s:7:"comment";a:1:{s:2:"en";s:96:"A related resource that is referenced, cited, or otherwise pointed to by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/isFormatOf";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/isFormatOf";s:5:"label";a:1:{s:2:"en";s:12:"Is Format Of";}s:7:"comment";a:1:{s:2:"en";s:99:"A related resource that is substantially the same as the described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/hasFormat";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/hasFormat";s:5:"label";a:1:{s:2:"en";s:10:"Has Format";}s:7:"comment";a:1:{s:2:"en";s:112:"A related resource that is substantially the same as the pre-existing described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/conformsTo";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/conformsTo";s:5:"label";a:1:{s:2:"en";s:11:"Conforms To";}s:7:"comment";a:1:{s:2:"en";s:65:"An established standard to which the described resource conforms.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Standard";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/spatial";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/spatial";s:5:"label";a:1:{s:2:"en";s:16:"Spatial Coverage";}s:7:"comment";a:1:{s:2:"en";s:40:"Spatial characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Location";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/temporal";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/temporal";s:5:"label";a:1:{s:2:"en";s:17:"Temporal Coverage";}s:7:"comment";a:1:{s:2:"en";s:41:"Temporal characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:37:"http://purl.org/dc/terms/PeriodOfTime";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/mediator";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/mediator";s:5:"label";a:1:{s:2:"en";s:8:"Mediator";}s:7:"comment";a:1:{s:2:"en";s:95:"An entity that mediates access to the resource and for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/dateAccepted";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/dateAccepted";s:5:"label";a:1:{s:2:"en";s:13:"Date Accepted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of acceptance of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/dateCopyrighted";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/dateCopyrighted";s:5:"label";a:1:{s:2:"en";s:16:"Date Copyrighted";}s:7:"comment";a:1:{s:2:"en";s:18:"Date of copyright.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/dateSubmitted";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/dateSubmitted";s:5:"label";a:1:{s:2:"en";s:14:"Date Submitted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of submission of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/educationLevel";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/educationLevel";s:5:"label";a:1:{s:2:"en";s:24:"Audience Education Level";}s:7:"comment";a:1:{s:2:"en";s:140:"A class of entity, defined in terms of progression through an educational or training context, for which the described resource is intended.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/accessRights";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/accessRights";s:5:"label";a:1:{s:2:"en";s:13:"Access Rights";}s:7:"comment";a:1:{s:2:"en";s:86:"Information about who can access the resource or an indication of its security status.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:46:"http://purl.org/dc/terms/bibliographicCitation";a:7:{s:3:"uri";s:46:"http://purl.org/dc/terms/bibliographicCitation";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Citation";}s:7:"comment";a:1:{s:2:"en";s:43:"A bibliographic reference for the resource.";}s:6:"domain";a:1:{i:0;s:46:"http://purl.org/dc/terms/BibliographicResource";}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";i:1;s:35:"http://purl.org/dc/terms/identifier";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/license";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/license";s:5:"label";a:1:{s:2:"en";s:7:"License";}s:7:"comment";a:1:{s:2:"en";s:78:"A legal document giving official permission to do something with the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/LicenseDocument";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/rightsHolder";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/rightsHolder";s:5:"label";a:1:{s:2:"en";s:13:"Rights Holder";}s:7:"comment";a:1:{s:2:"en";s:69:"A person or organization owning or managing rights over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/provenance";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/provenance";s:5:"label";a:1:{s:2:"en";s:10:"Provenance";}s:7:"comment";a:1:{s:2:"en";s:160:"A statement of any changes in ownership and custody of the resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/ProvenanceStatement";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:44:"http://purl.org/dc/terms/instructionalMethod";a:7:{s:3:"uri";s:44:"http://purl.org/dc/terms/instructionalMethod";s:5:"label";a:1:{s:2:"en";s:20:"Instructional Method";}s:7:"comment";a:1:{s:2:"en";s:112:"A process, used to engender knowledge, attitudes and skills, that the described resource is designed to support.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/MethodOfInstruction";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualMethod";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualMethod";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Method";}s:7:"comment";a:1:{s:2:"en";s:52:"The method by which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/MethodOfAccrual";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/terms/accrualPeriodicity";a:7:{s:3:"uri";s:43:"http://purl.org/dc/terms/accrualPeriodicity";s:5:"label";a:1:{s:2:"en";s:19:"Accrual Periodicity";}s:7:"comment";a:1:{s:2:"en";s:57:"The frequency with which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:34:"http://purl.org/dc/terms/Frequency";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualPolicy";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualPolicy";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Policy";}s:7:"comment";a:1:{s:2:"en";s:59:"The policy governing the addition of items to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:31:"http://purl.org/dc/terms/Policy";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/elements/1.1/title";a:7:{s:3:"uri";s:37:"http://purl.org/dc/elements/1.1/title";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/creator";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/creator";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/subject";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/description";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/description";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:41:"http://purl.org/dc/elements/1.1/publisher";a:7:{s:3:"uri";s:41:"http://purl.org/dc/elements/1.1/publisher";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/contributor";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/contributor";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/date";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/date";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/type";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/type";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/format";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/format";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:42:"http://purl.org/dc/elements/1.1/identifier";a:7:{s:3:"uri";s:42:"http://purl.org/dc/elements/1.1/identifier";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/source";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/source";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/language";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/language";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/relation";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/relation";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/coverage";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/coverage";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/rights";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/rights";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://xmlns.com/foaf/0.1/maker";a:7:{s:3:"uri";s:31:"http://xmlns.com/foaf/0.1/maker";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:7:{s:3:"xml";s:36:"http://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"http://www.w3.org/1999/02/22-rdf-syntax-ns#";s:3:"owl";s:30:"http://www.w3.org/2002/07/owl#";s:4:"skos";s:36:"http://www.w3.org/2004/02/skos/core#";s:4:"dcam";s:24:"http://purl.org/dc/dcam/";s:7:"dcterms";s:25:"http://purl.org/dc/terms/";s:4:"rdfs";s:37:"http://www.w3.org/2000/01/rdf-schema#";}}'); +$dcat = unserialize('a:5:{s:3:"uri";s:26:"https://www.w3.org/ns/dcat#";s:5:"title";a:0:{}s:11:"description";a:0:{}s:5:"terms";a:4:{s:10:"rdfs_class";a:13:{s:33:"https://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"https://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"https://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"https://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"https://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"https://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"https://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"https://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"https://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"https://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"https://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"https://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/dcmitype/Dataset";a:5:{s:3:"uri";s:35:"http://purl.org/dc/dcmitype/Dataset";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:45:"https://www.w3.org/2000/01/rdf-schema#Resource";a:5:{s:3:"uri";s:45:"https://www.w3.org/2000/01/rdf-schema#Resource";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"https://www.w3.org/2001/XMLSchema#integer";a:5:{s:3:"uri";s:40:"https://www.w3.org/2001/XMLSchema#integer";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:43:"https://www.w3.org/2004/02/skos/core#Concept";a:5:{s:3:"uri";s:43:"https://www.w3.org/2004/02/skos/core#Concept";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:49:"https://www.w3.org/2004/02/skos/core#ConceptScheme";a:5:{s:3:"uri";s:49:"https://www.w3.org/2004/02/skos/core#ConceptScheme";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:9:"owl_class";a:7:{s:33:"https://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"https://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"https://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"https://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"https://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"https://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"https://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"https://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"https://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"https://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"https://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"https://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:14:{s:35:"https://www.w3.org/ns/dcat#accessURL";a:7:{s:3:"uri";s:35:"https://www.w3.org/ns/dcat#accessURL";s:5:"label";a:1:{s:3:"und";s:10:"access URL";}s:7:"comment";a:1:{s:3:"und";s:245:"points to the location of a distribution. This can be a direct download link, a link to an HTML page containing a link to the actual data, Feed, Web Service etc. the semantic is determined by its domain (Distribution, Feed, WebService, Download)";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:45:"https://www.w3.org/2000/01/rdf-schema#Resource";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"https://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"https://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"https://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"https://www.w3.org/ns/dcat#dataDictionary";a:7:{s:3:"uri";s:40:"https://www.w3.org/ns/dcat#dataDictionary";s:5:"label";a:1:{s:3:"und";s:15:"data dictionary";}s:7:"comment";a:1:{s:3:"und";s:64:"links a dataset to a dictionary that helps interpreting the data";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"https://www.w3.org/ns/dcat#dataQuality";a:7:{s:3:"uri";s:37:"https://www.w3.org/ns/dcat#dataQuality";s:5:"label";a:1:{s:3:"und";s:12:"data quality";}s:7:"comment";a:1:{s:3:"und";s:185:"describes the quality of data e.g. precision. This should not be used to describe the data collection characteristics, other more specialized statistical properties can be used instead.";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"https://www.w3.org/ns/dcat#dataset";a:7:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#dataset";s:5:"label";a:1:{s:3:"und";s:7:"dataset";}s:7:"comment";a:1:{s:3:"und";s:37:"a dataset that is part of the catalog";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"https://www.w3.org/ns/dcat#distribution";a:7:{s:3:"uri";s:38:"https://www.w3.org/ns/dcat#distribution";s:5:"label";a:1:{s:3:"und";s:12:"distribution";}s:7:"comment";a:1:{s:3:"und";s:56:"connects a dataset to one of its available distributions";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"https://www.w3.org/ns/dcat#granularity";a:7:{s:3:"uri";s:37:"https://www.w3.org/ns/dcat#granularity";s:5:"label";a:1:{s:3:"und";s:11:"granularity";}s:7:"comment";a:1:{s:3:"und";s:98:"describes the level of granularity of data in a dataset. The granularity can be in time, place etc";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"https://www.w3.org/ns/dcat#keyword";a:7:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#keyword";s:5:"label";a:1:{s:3:"und";s:7:"keyword";}s:7:"comment";a:1:{s:3:"und";s:38:"a keyword or tag describing the datase";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:32:"https://www.w3.org/ns/dcat#record";a:7:{s:3:"uri";s:32:"https://www.w3.org/ns/dcat#record";s:5:"label";a:1:{s:3:"und";s:6:"record";}s:7:"comment";a:1:{s:3:"und";s:30:"links a catalog to its records";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:39:"https://www.w3.org/ns/dcat#CatalogRecord";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:30:"https://www.w3.org/ns/dcat#size";a:7:{s:3:"uri";s:30:"https://www.w3.org/ns/dcat#size";s:5:"label";a:1:{s:3:"und";s:4:"size";}s:7:"comment";a:1:{s:3:"und";s:26:"the size of a distribution";}s:6:"domain";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:31:"http://purl.org/dc/terms/extent";}s:7:"inverse";a:0:{}}s:31:"https://www.w3.org/ns/dcat#theme";a:7:{s:3:"uri";s:31:"https://www.w3.org/ns/dcat#theme";s:5:"label";a:1:{s:3:"und";s:5:"theme";}s:7:"comment";a:1:{s:3:"und";s:68:"the main category of the dataset. A dataset can have multiple themes";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:43:"https://www.w3.org/2004/02/skos/core#Concept";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:39:"https://www.w3.org/ns/dcat#themeTaxonomy";a:7:{s:3:"uri";s:39:"https://www.w3.org/ns/dcat#themeTaxonomy";s:5:"label";a:1:{s:3:"und";s:6:"themes";}s:7:"comment";a:1:{s:3:"und";s:74:"the knowledge organization system (KOS) used to classify catalogs datasets";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:49:"https://www.w3.org/2004/02/skos/core#ConceptScheme";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}s:21:"owl_property_datatype";a:1:{s:31:"https://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"https://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"https://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:5:{s:3:"xml";s:36:"https://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"https://www.w3.org/1999/02/22-rdf-syntax-ns#";i:0;s:37:"https://www.w3.org/2000/01/rdf-schema#";s:3:"dct";s:25:"http://purl.org/dc/terms/";s:3:"owl";s:30:"https://www.w3.org/2002/07/owl#";}}'); + +$dc = unserialize('a:5:{s:3:"uri";s:25:"http://purl.org/dc/terms/";s:5:"title";a:1:{s:2:"en";s:27:"DCMI Metadata Terms - other";}s:11:"description";a:0:{}s:5:"terms";a:2:{s:10:"rdfs_class";a:25:{s:30:"http://purl.org/dc/terms/Agent";a:5:{s:3:"uri";s:30:"http://purl.org/dc/terms/Agent";s:5:"label";a:1:{s:2:"en";s:5:"Agent";}s:7:"comment";a:1:{s:2:"en";s:45:"A resource that acts or has the power to act.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/AgentClass";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/AgentClass";s:5:"label";a:1:{s:2:"en";s:11:"Agent Class";}s:7:"comment";a:1:{s:2:"en";s:18:"A group of agents.";}s:10:"superclass";a:1:{i:0;s:42:"https://www.w3.org/2000/01/rdf-schema#Class";}s:8:"disjoint";a:0:{}}s:46:"http://purl.org/dc/terms/BibliographicResource";a:5:{s:3:"uri";s:46:"http://purl.org/dc/terms/BibliographicResource";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Resource";}s:7:"comment";a:1:{s:2:"en";s:47:"A book, article, or other documentary resource.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/FileFormat";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/FileFormat";s:5:"label";a:1:{s:2:"en";s:11:"File Format";}s:7:"comment";a:1:{s:2:"en";s:26:"A digital resource format.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/Frequency";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/Frequency";s:5:"label";a:1:{s:2:"en";s:9:"Frequency";}s:7:"comment";a:1:{s:2:"en";s:33:"A rate at which something recurs.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/Jurisdiction";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/Jurisdiction";s:5:"label";a:1:{s:2:"en";s:12:"Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:69:"The extent or range of judicial, law enforcement, or other authority.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/LicenseDocument";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/LicenseDocument";s:5:"label";a:1:{s:2:"en";s:16:"License Document";}s:7:"comment";a:1:{s:2:"en";s:76:"A legal document giving official permission to do something with a Resource.";}s:10:"superclass";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/LinguisticSystem";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/LinguisticSystem";s:5:"label";a:1:{s:2:"en";s:17:"Linguistic System";}s:7:"comment";a:1:{s:2:"en";s:77:"A system of signs, symbols, sounds, gestures, or rules used in communication.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Location";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Location";s:5:"label";a:1:{s:2:"en";s:8:"Location";}s:7:"comment";a:1:{s:2:"en";s:32:"A spatial region or named place.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";a:5:{s:3:"uri";s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";s:5:"label";a:1:{s:2:"en";s:33:"Location, Period, or Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:44:"A location, period of time, or jurisdiction.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/MediaType";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/MediaType";s:5:"label";a:1:{s:2:"en";s:10:"Media Type";}s:7:"comment";a:1:{s:2:"en";s:33:"A file format or physical medium.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";a:5:{s:3:"uri";s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";s:5:"label";a:1:{s:2:"en";s:20:"Media Type or Extent";}s:7:"comment";a:1:{s:2:"en";s:23:"A media type or extent.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/MethodOfInstruction";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/MethodOfInstruction";s:5:"label";a:1:{s:2:"en";s:21:"Method of Instruction";}s:7:"comment";a:1:{s:2:"en";s:68:"A process that is used to engender knowledge, attitudes, and skills.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/MethodOfAccrual";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/MethodOfAccrual";s:5:"label";a:1:{s:2:"en";s:17:"Method of Accrual";}s:7:"comment";a:1:{s:2:"en";s:54:"A method by which resources are added to a collection.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/PeriodOfTime";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/PeriodOfTime";s:5:"label";a:1:{s:2:"en";s:14:"Period of Time";}s:7:"comment";a:1:{s:2:"en";s:72:"An interval of time that is named or defined by its start and end dates.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/PhysicalMedium";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/PhysicalMedium";s:5:"label";a:1:{s:2:"en";s:15:"Physical Medium";}s:7:"comment";a:1:{s:2:"en";s:31:"A physical material or carrier.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/PhysicalResource";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/PhysicalResource";s:5:"label";a:1:{s:2:"en";s:17:"Physical Resource";}s:7:"comment";a:1:{s:2:"en";s:17:"A material thing.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:31:"http://purl.org/dc/terms/Policy";a:5:{s:3:"uri";s:31:"http://purl.org/dc/terms/Policy";s:5:"label";a:1:{s:2:"en";s:6:"Policy";}s:7:"comment";a:1:{s:2:"en";s:118:"A plan or course of action by an authority, intended to influence and determine decisions, actions, and other matters.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/ProvenanceStatement";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/ProvenanceStatement";s:5:"label";a:1:{s:2:"en";s:20:"Provenance Statement";}s:7:"comment";a:1:{s:2:"en";s:158:"A statement of any changes in ownership and custody of a resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/RightsStatement";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/RightsStatement";s:5:"label";a:1:{s:2:"en";s:16:"Rights Statement";}s:7:"comment";a:1:{s:2:"en";s:197:"A statement about the intellectual property rights (IPR) held in or over a Resource, a legal document giving official permission to do something with a resource, or a statement about access rights.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/SizeOrDuration";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/SizeOrDuration";s:5:"label";a:1:{s:2:"en";s:16:"Size or Duration";}s:7:"comment";a:1:{s:2:"en";s:58:"A dimension or extent, or a time taken to play or execute.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Standard";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Standard";s:5:"label";a:1:{s:2:"en";s:8:"Standard";}s:7:"comment";a:1:{s:2:"en";s:86:"A basis for comparison; a reference point against which other things can be evaluated.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:42:"https://www.w3.org/2000/01/rdf-schema#Class";a:5:{s:3:"uri";s:42:"https://www.w3.org/2000/01/rdf-schema#Class";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:38:"http://purl.org/dc/dcmitype/Collection";a:5:{s:3:"uri";s:38:"http://purl.org/dc/dcmitype/Collection";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:71:{s:30:"http://purl.org/dc/terms/title";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/title";s:5:"label";a:1:{s:2:"en";s:5:"Title";}s:7:"comment";a:1:{s:2:"en";s:29:"A name given to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/creator";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/creator";s:5:"label";a:1:{s:2:"en";s:7:"Creator";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity primarily responsible for making the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:2:{i:0;s:39:"http://purl.org/dc/elements/1.1/creator";i:1;s:36:"http://purl.org/dc/terms/contributor";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:1:{s:2:"en";s:7:"Subject";}s:7:"comment";a:1:{s:2:"en";s:26:"The topic of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:39:"http://purl.org/dc/elements/1.1/subject";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/description";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/description";s:5:"label";a:1:{s:2:"en";s:11:"Description";}s:7:"comment";a:1:{s:2:"en";s:27:"An account of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/publisher";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/publisher";s:5:"label";a:1:{s:2:"en";s:9:"Publisher";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity responsible for making the resource available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:41:"http://purl.org/dc/elements/1.1/publisher";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/contributor";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/contributor";s:5:"label";a:1:{s:2:"en";s:11:"Contributor";}s:7:"comment";a:1:{s:2:"en";s:63:"An entity responsible for making contributions to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/contributor";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/date";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/date";s:5:"label";a:1:{s:2:"en";s:4:"Date";}s:7:"comment";a:1:{s:2:"en";s:84:"A point or period of time associated with an event in the lifecycle of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/type";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/type";s:5:"label";a:1:{s:2:"en";s:4:"Type";}s:7:"comment";a:1:{s:2:"en";s:36:"The nature or genre of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"https://www.w3.org/2000/01/rdf-schema#Class";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/type";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/format";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/format";s:5:"label";a:1:{s:2:"en";s:6:"Format";}s:7:"comment";a:1:{s:2:"en";s:64:"The file format, physical medium, or dimensions of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/identifier";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/identifier";s:5:"label";a:1:{s:2:"en";s:10:"Identifier";}s:7:"comment";a:1:{s:2:"en";s:64:"An unambiguous reference to the resource within a given context.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/source";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/source";s:5:"label";a:1:{s:2:"en";s:6:"Source";}s:7:"comment";a:1:{s:2:"en";s:64:"A related resource from which the described resource is derived.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/source";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/language";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/language";s:5:"label";a:1:{s:2:"en";s:8:"Language";}s:7:"comment";a:1:{s:2:"en";s:27:"A language of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:41:"http://purl.org/dc/terms/LinguisticSystem";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/language";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/relation";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/relation";s:5:"label";a:1:{s:2:"en";s:8:"Relation";}s:7:"comment";a:1:{s:2:"en";s:19:"A related resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/coverage";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/coverage";s:5:"label";a:1:{s:2:"en";s:8:"Coverage";}s:7:"comment";a:1:{s:2:"en";s:147:"The spatial or temporal topic of the resource, the spatial applicability of the resource, or the jurisdiction under which the resource is relevant.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/rights";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/rights";s:5:"label";a:1:{s:2:"en";s:6:"Rights";}s:7:"comment";a:1:{s:2:"en";s:55:"Information about rights held in and over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/audience";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/audience";s:5:"label";a:1:{s:2:"en";s:8:"Audience";}s:7:"comment";a:1:{s:2:"en";s:62:"A class of entity for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/alternative";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/alternative";s:5:"label";a:1:{s:2:"en";s:17:"Alternative Title";}s:7:"comment";a:1:{s:2:"en";s:37:"An alternative name for the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";i:1;s:30:"http://purl.org/dc/terms/title";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/tableOfContents";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/tableOfContents";s:5:"label";a:1:{s:2:"en";s:17:"Table Of Contents";}s:7:"comment";a:1:{s:2:"en";s:35:"A list of subunits of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/abstract";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/abstract";s:5:"label";a:1:{s:2:"en";s:8:"Abstract";}s:7:"comment";a:1:{s:2:"en";s:26:"A summary of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/created";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/created";s:5:"label";a:1:{s:2:"en";s:12:"Date Created";}s:7:"comment";a:1:{s:2:"en";s:33:"Date of creation of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:30:"http://purl.org/dc/terms/valid";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/valid";s:5:"label";a:1:{s:2:"en";s:10:"Date Valid";}s:7:"comment";a:1:{s:2:"en";s:47:"Date (often a range) of validity of a resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/available";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/available";s:5:"label";a:1:{s:2:"en";s:14:"Date Available";}s:7:"comment";a:1:{s:2:"en";s:71:"Date (often a range) that the resource became or will become available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/issued";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/issued";s:5:"label";a:1:{s:2:"en";s:11:"Date Issued";}s:7:"comment";a:1:{s:2:"en";s:60:"Date of formal issuance (e.g., publication) of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/modified";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/modified";s:5:"label";a:1:{s:2:"en";s:13:"Date Modified";}s:7:"comment";a:1:{s:2:"en";s:39:"Date on which the resource was changed.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:1:{s:2:"en";s:6:"Extent";}s:7:"comment";a:1:{s:2:"en";s:37:"The size or duration of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/SizeOrDuration";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/medium";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/medium";s:5:"label";a:1:{s:2:"en";s:6:"Medium";}s:7:"comment";a:1:{s:2:"en";s:49:"The material or physical carrier of the resource.";}s:6:"domain";a:1:{i:0;s:41:"http://purl.org/dc/terms/PhysicalResource";}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/PhysicalMedium";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/isVersionOf";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/isVersionOf";s:5:"label";a:1:{s:2:"en";s:13:"Is Version Of";}s:7:"comment";a:1:{s:2:"en";s:88:"A related resource of which the described resource is a version, edition, or adaptation.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/hasVersion";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/hasVersion";s:5:"label";a:1:{s:2:"en";s:11:"Has Version";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource that is a version, edition, or adaptation of the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isReplacedBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isReplacedBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Replaced By";}s:7:"comment";a:1:{s:2:"en";s:83:"A related resource that supplants, displaces, or supersedes the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/replaces";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/replaces";s:5:"label";a:1:{s:2:"en";s:8:"Replaces";}s:7:"comment";a:1:{s:2:"en";s:90:"A related resource that is supplanted, displaced, or superseded by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isRequiredBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isRequiredBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Required By";}s:7:"comment";a:1:{s:2:"en";s:104:"A related resource that requires the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/requires";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/requires";s:5:"label";a:1:{s:2:"en";s:8:"Requires";}s:7:"comment";a:1:{s:2:"en";s:110:"A related resource that is required by the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/isPartOf";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/isPartOf";s:5:"label";a:1:{s:2:"en";s:10:"Is Part Of";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource in which the described resource is physically or logically included.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/hasPart";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/hasPart";s:5:"label";a:1:{s:2:"en";s:8:"Has Part";}s:7:"comment";a:1:{s:2:"en";s:93:"A related resource that is included either physically or logically in the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/isReferencedBy";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/isReferencedBy";s:5:"label";a:1:{s:2:"en";s:16:"Is Referenced By";}s:7:"comment";a:1:{s:2:"en";s:89:"A related resource that references, cites, or otherwise points to the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/references";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/references";s:5:"label";a:1:{s:2:"en";s:10:"References";}s:7:"comment";a:1:{s:2:"en";s:96:"A related resource that is referenced, cited, or otherwise pointed to by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/isFormatOf";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/isFormatOf";s:5:"label";a:1:{s:2:"en";s:12:"Is Format Of";}s:7:"comment";a:1:{s:2:"en";s:99:"A related resource that is substantially the same as the described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/hasFormat";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/hasFormat";s:5:"label";a:1:{s:2:"en";s:10:"Has Format";}s:7:"comment";a:1:{s:2:"en";s:112:"A related resource that is substantially the same as the pre-existing described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/conformsTo";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/conformsTo";s:5:"label";a:1:{s:2:"en";s:11:"Conforms To";}s:7:"comment";a:1:{s:2:"en";s:65:"An established standard to which the described resource conforms.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Standard";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/spatial";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/spatial";s:5:"label";a:1:{s:2:"en";s:16:"Spatial Coverage";}s:7:"comment";a:1:{s:2:"en";s:40:"Spatial characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Location";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/temporal";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/temporal";s:5:"label";a:1:{s:2:"en";s:17:"Temporal Coverage";}s:7:"comment";a:1:{s:2:"en";s:41:"Temporal characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:37:"http://purl.org/dc/terms/PeriodOfTime";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/mediator";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/mediator";s:5:"label";a:1:{s:2:"en";s:8:"Mediator";}s:7:"comment";a:1:{s:2:"en";s:95:"An entity that mediates access to the resource and for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/dateAccepted";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/dateAccepted";s:5:"label";a:1:{s:2:"en";s:13:"Date Accepted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of acceptance of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/dateCopyrighted";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/dateCopyrighted";s:5:"label";a:1:{s:2:"en";s:16:"Date Copyrighted";}s:7:"comment";a:1:{s:2:"en";s:18:"Date of copyright.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/dateSubmitted";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/dateSubmitted";s:5:"label";a:1:{s:2:"en";s:14:"Date Submitted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of submission of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/educationLevel";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/educationLevel";s:5:"label";a:1:{s:2:"en";s:24:"Audience Education Level";}s:7:"comment";a:1:{s:2:"en";s:140:"A class of entity, defined in terms of progression through an educational or training context, for which the described resource is intended.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/accessRights";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/accessRights";s:5:"label";a:1:{s:2:"en";s:13:"Access Rights";}s:7:"comment";a:1:{s:2:"en";s:86:"Information about who can access the resource or an indication of its security status.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:46:"http://purl.org/dc/terms/bibliographicCitation";a:7:{s:3:"uri";s:46:"http://purl.org/dc/terms/bibliographicCitation";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Citation";}s:7:"comment";a:1:{s:2:"en";s:43:"A bibliographic reference for the resource.";}s:6:"domain";a:1:{i:0;s:46:"http://purl.org/dc/terms/BibliographicResource";}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";i:1;s:35:"http://purl.org/dc/terms/identifier";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/license";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/license";s:5:"label";a:1:{s:2:"en";s:7:"License";}s:7:"comment";a:1:{s:2:"en";s:78:"A legal document giving official permission to do something with the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/LicenseDocument";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/rightsHolder";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/rightsHolder";s:5:"label";a:1:{s:2:"en";s:13:"Rights Holder";}s:7:"comment";a:1:{s:2:"en";s:69:"A person or organization owning or managing rights over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/provenance";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/provenance";s:5:"label";a:1:{s:2:"en";s:10:"Provenance";}s:7:"comment";a:1:{s:2:"en";s:160:"A statement of any changes in ownership and custody of the resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/ProvenanceStatement";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:44:"http://purl.org/dc/terms/instructionalMethod";a:7:{s:3:"uri";s:44:"http://purl.org/dc/terms/instructionalMethod";s:5:"label";a:1:{s:2:"en";s:20:"Instructional Method";}s:7:"comment";a:1:{s:2:"en";s:112:"A process, used to engender knowledge, attitudes and skills, that the described resource is designed to support.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/MethodOfInstruction";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualMethod";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualMethod";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Method";}s:7:"comment";a:1:{s:2:"en";s:52:"The method by which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/MethodOfAccrual";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/terms/accrualPeriodicity";a:7:{s:3:"uri";s:43:"http://purl.org/dc/terms/accrualPeriodicity";s:5:"label";a:1:{s:2:"en";s:19:"Accrual Periodicity";}s:7:"comment";a:1:{s:2:"en";s:57:"The frequency with which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:34:"http://purl.org/dc/terms/Frequency";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualPolicy";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualPolicy";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Policy";}s:7:"comment";a:1:{s:2:"en";s:59:"The policy governing the addition of items to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:31:"http://purl.org/dc/terms/Policy";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/elements/1.1/title";a:7:{s:3:"uri";s:37:"http://purl.org/dc/elements/1.1/title";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/creator";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/creator";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/subject";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/description";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/description";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:41:"http://purl.org/dc/elements/1.1/publisher";a:7:{s:3:"uri";s:41:"http://purl.org/dc/elements/1.1/publisher";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/contributor";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/contributor";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/date";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/date";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/type";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/type";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/format";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/format";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:42:"http://purl.org/dc/elements/1.1/identifier";a:7:{s:3:"uri";s:42:"http://purl.org/dc/elements/1.1/identifier";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/source";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/source";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/language";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/language";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/relation";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/relation";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/coverage";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/coverage";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/rights";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/rights";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://xmlns.com/foaf/0.1/maker";a:7:{s:3:"uri";s:31:"http://xmlns.com/foaf/0.1/maker";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:7:{s:3:"xml";s:36:"https://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"https://www.w3.org/1999/02/22-rdf-syntax-ns#";s:3:"owl";s:30:"https://www.w3.org/2002/07/owl#";s:4:"skos";s:36:"https://www.w3.org/2004/02/skos/core#";s:4:"dcam";s:24:"http://purl.org/dc/dcam/";s:7:"dcterms";s:25:"http://purl.org/dc/terms/";s:4:"rdfs";s:37:"https://www.w3.org/2000/01/rdf-schema#";}}'); diff --git a/dkan/modules/contrib/beautytips/PATCHES.txt b/dkan/modules/contrib/beautytips/PATCHES.txt index 1c42a64f6..9bf002538 100644 --- a/dkan/modules/contrib/beautytips/PATCHES.txt +++ b/dkan/modules/contrib/beautytips/PATCHES.txt @@ -1,4 +1,4 @@ The following patches have been applied to this project: -- http://drupal.org/files/include-excanvas-via-libraries-api-d7-849232-13.patch +- https://drupal.org/files/include-excanvas-via-libraries-api-d7-849232-13.patch This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/feeds_field_fetcher/PATCHES.txt b/dkan/modules/contrib/feeds_field_fetcher/PATCHES.txt index b209e35f0..3e1a62635 100644 --- a/dkan/modules/contrib/feeds_field_fetcher/PATCHES.txt +++ b/dkan/modules/contrib/feeds_field_fetcher/PATCHES.txt @@ -1,5 +1,5 @@ The following patches have been applied to this project: -- http://www.drupal.org/files/issues/feeds_field_fetcher-typo-error-2315425-1.patch -- http://www.drupal.org/files/issues/feeds_field_fetcher_error-validation-config.patch +- https://www.drupal.org/files/issues/feeds_field_fetcher-typo-error-2315425-1.patch +- https://www.drupal.org/files/issues/feeds_field_fetcher_error-validation-config.patch This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/field_group/PATCHES.txt b/dkan/modules/contrib/field_group/PATCHES.txt index 3fd4837e5..a608c2722 100644 --- a/dkan/modules/contrib/field_group/PATCHES.txt +++ b/dkan/modules/contrib/field_group/PATCHES.txt @@ -1,5 +1,5 @@ The following patches have been applied to this project: -- http://drupal.org/files/issues/field-group-show-ajax-2042681-8.patch +- https://drupal.org/files/issues/field-group-show-ajax-2042681-8.patch - https://www.drupal.org/files/issues/hash-location-sanitization.diff This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/gravatar/PATCHES.txt b/dkan/modules/contrib/gravatar/PATCHES.txt index bfde95967..c04ade799 100644 --- a/dkan/modules/contrib/gravatar/PATCHES.txt +++ b/dkan/modules/contrib/gravatar/PATCHES.txt @@ -1,4 +1,4 @@ The following patches have been applied to this project: -- http://drupal.org/files/views-display-user-picture-doesn-t-display-gravatar-1568162-10.patch +- https://drupal.org/files/views-display-user-picture-doesn-t-display-gravatar-1568162-10.patch This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/gravatar/gravatar.info b/dkan/modules/contrib/gravatar/gravatar.info index 0c11f7fb7..b335a35eb 100644 --- a/dkan/modules/contrib/gravatar/gravatar.info +++ b/dkan/modules/contrib/gravatar/gravatar.info @@ -7,7 +7,7 @@ files[] = gravatar.admin.inc files[] = views_handler_gravatar.inc configure = admin/config/people/gravatar -; Information added by drush on 2011-12-31 +; Information added by drush on 2012-01-01 version = "7.x-1.1+5-dev" project = "gravatar" datestamp = "1325392401" \ No newline at end of file diff --git a/dkan/modules/contrib/linkchecker/CHANGELOG.txt b/dkan/modules/contrib/linkchecker/CHANGELOG.txt new file mode 100644 index 000000000..150927d80 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/CHANGELOG.txt @@ -0,0 +1,288 @@ +linkchecker 7.x-1.3, August 6, 2016 +----------------------------------- + +* Issue #2060243 by hswong3i, hass: Split linkchecker_scan_nodetypes as content type specific. +* Issue #2651180 by hass: Ignore fragment used for ajax requests +* Upgrade outdated HTTP user agents. +* Issue #2660694 by heddn, hass: PHP 7.0 errors +* Fixed two typos +* Issue #2443055 by Alan D.: Optionally reduce the number of LinkChecker log entries +* Issue #2616082 by rakesh.gectcr: Add @return type and @param values in the comment docblocks +* Issue #2303177: "Back to Top" Page anchor being reported as a 404 error +* Issue #2340211 by iStryker: Notice: Undefined index: value + +linkchecker 7.x-1.2, June 7, 2014 +--------------------------------- + +* Issue #2280827: Notice: Undefined index: content-type in _linkchecker_status_handling() +* Issue #2146127 by hass: Notice: Undefined variable: format in_linkchecker_parse_fields() +* Issue #1334056 by Alan D., hass: Undefined indices in linkchecker_parse_fields() and _linkchecker_add_node_links() +* Issue #2088461 by fonant, hass: PDF link with #page= results in "URL fragment identifier not found in content" +* Issue #500866 by hass: Remove t() from assertion messages in tests +* Added Smiley module and Web Links modules to filter blacklist. +* Issue #1923328 by larowlan: Fragment check fails when source page contains spaces between attribute name, equals and value. +* Issue #1923328 by hass: Notice: Undefined property: stdClass::$field_tags +* Issue #1948782 by jlscott: Linkchecker does not handle link cleanup on 'link' fields +* Issue #1926558 by hass: Block extraction re-scans fail. + +linkchecker 7.x-1.1, February 14, 2013 +-------------------------------------- + +* Code style review and fixes (minor level) +* No need to check comment/block enable variables in auto update. +* Issue #1901018 by hass: ERROR - __clone method called on non-object. +* Issue #1901014 by hass: ERROR - Cannot use object of type stdClass as array. +* Code style: indent secondary line of comment one space +* #1891900: Uninstall of variable 'linkchecker_check_connections_max' failed. +* Use #empty in empty table. +* #1882602: Compatible with Drupal <7.15 +* #1850210 followup: _linkchecker_unpublish_nodes() may run out of memory by loading all nodes at once. +* #1719174: Editing node throws "Undefined property" stdClass::$nid in hook_node_prepare(). +* #1879316: Support Workbench Moderation workflow (forward revisons handling) +* Fixed a test to use LANGUAGE_NONE constant. +* #1880652: Refactor _linkchecker_parse_fields() and _linkchecker_replace_fields() to be less expensive, see #1040790 for more details. +* #1875602: Check URL fragment identifiers in content +* Minor code style fixes + +linkchecker 7.x-1.0, December 24, 2012 +-------------------------------------- + +* Fixed some typos. +* #1850210: Autorepair may run out of memory by loading all nodes/comments at once. +* #1210606: Limited argument length in entity_load() and other functions. +* Upgraded outdated HTTP user agents. +* #380052: Add support with non-blocking parallel link checking. +* #1867460: Prevent save on automatic updates, if content has not changed. +* #1804842 follow up: Exit if all node types are disabled +* #1450672: Cron task does not impersonate to admin user on automatic content updates. +* Remove documentation leftover from readme about a setting not available. +* #1727552: Notice: Undefined property: stdClass::$language in linkchecker_parse_fields(). Core follow up of #1495648: Introduce entity language support +* Notice: Undefined variable: is_https in _linkchecker_extract_links() +* #1804842: Lots of warnings when comment/block modules are not installed +* Set full HTML format in block test +* Added interface tests to verify drupal_set_message() +* #1857620: hook_form_alter() fails on BASE_FORM_ID 'comment_form' +* #1811908: Allow extracting protocol relative url's +* #1831630: Array being presented to Status report page +* #1441574: Port D6 access bypass bugfixes to D7. +* #1678812: Notice: Undefined property: stdClass::$module in _linkchecker_add_block_custom_links() +* #1678812: Refactored blocks extraction/replacement +* #1678812: Added linkchecker_block_custom_block_get() for a more consistent block_custom object. +* #1586022: linkchecker generating bad User-Agent string +* Status code 500 on HEAD/GET does not increase fail_count +* #1524732: Notice on blocks save / Blocks body cannot exists + +linkchecker 7.x-1.0-beta1, February 15, 2012 +-------------------------------------------- + +* #1438376: D7 Upgrade failed with PHP 5 < 5.3.0, array_replace() missing +* #1429284: Don't follow redirects +* #1416830: Link fields are not being extracted +* #1410376: Cannot open blocks to edit from the broken links report +* #1410388: Cannot open comment to edit from links in the broken links report +* #1410402: After deleting comments, Links are still displayed as Broken +* #1405512: After deleting blocks, Links are still displayed as Broken +* #1405504: Re-check link after creating redirect +* #1350926: Added Drush support +* HTML5: Added support for <track> tags in <audio> and <video> tags +* Replace links with 301 redirections in all supported fields. +* #1388760: Use (node|comment)_load_multiple() where possible. +* Upgraded README.txt to D7 +* Core upgrade.php destroys text +* #909504: D7 port - Upgrade blacklisted internal filter names. +* Removed obsolete linkchecker_extract_from_source variable +* Removed wysiwyg textarea exclusion hacks from D6 times. +* #1021384: New link checker mode : internal only +* #909504: D7 port - run _filter_url() on link module fields as linkchecker requires html code links to extact links via dom. +* #909504: CamelCase removal (code style) +* #1334056: Undefined indices in linkchecker_parse_fields() +* #1334056: Undefined index: und in _linkchecker_add_node_links() & _linkchecker_add_comment_links() +* Coder code style review, 95% of invalid errors/warnings skipped. +* Fixed wrong variable name in .test +* #1212748: Unprocessed redirect links +* Change to theme() function and reduce code. +* Upgrade theme('item_list') to D7. +* Re-use some constants from D7 core for future. +* Unique variable names +* db_truncate() is ***much*** more faster than db_delete(). +* Stop suppressing errors. If there are errors we need to catch them. +* Block module is optional in D7. +* node_load() now only takes nid and vid as parameters. +* Remove more tabs and indent bugs +* Replace tabs with spaces +* Upgrade "Remove dead links without references" query to new DB API. +* Remove obsolete comment about a core DB API bug that has been fixed long time ago. +* Removed coding debugging from test +* Upgrade theme_item_list() +* Upgraded linkchecker_link_edit_form() +* Updated tests +* Updated _linkchecker_status_handling() +* Added _linkchecker_replace_fields() +* Fixed some warnings +* Fixed a bug in link replace regex +* Upgraded theme('item_list') with items array. +* Upgraded comment link extraction +* Upgraded hook_comment_insert/update/delete. +* Minor code change for SQL statement consistency +* Upgrade to D7 code style - Implements hook_foo() +* Upgrade hook_node_insert/update/delete +* Code restructuring +* Fixed broken extractor code +* Block module is optional in D7. Added dependency message. +* D7 code style fixes +* Re-calulate 1000 links per batch +* Upgrade urlhashes from md5 to drupal_hash_base64. +* block_box_get() is now block_custom_block_get() +* Added field extraction support for nodes +* Blacklisted insert_block module +* node_load() now only takes nid and vid as parameters. +* drupal_set_title() automatically uses check_plain() in D7. +* Updated "Implements hook_foo()". +* New string concatenation rules in D7 +* drupal_set_message() should be enclosed within t() so that it is translatable +* Translations have been moved to l.d.o +* Update functions cleanup, prepare filter name updates. Added some text. +* New description, cck is now fields +* files[] is no longer required, except for files that define classes. +* Remove $ret from update hook +* Follow D7 update hook changes. +* Port D6 .test to D7 +* #801584 by hass: Extract "longdesc" from "img" tags +* Added configure link +* #788392 by Gábor: hook_perm() name not updated + +* Removed block 'title' for consitency reasons. It's only a title in administration and should not contain URLs +* Show a recommendation next to blacklisted filter names. +* #1149596: Links with spaces are not extracted +* Backported some documentation fixes +* Batch redirect URL added for blocks +* #860700: Disable all non-http(s) links for link checking until we have curl implemented +* #1054118: After batch scan the target url is not pointing to the node view +* #1075390: Added HTTP range support (Performance) +* Links disabled for checking (blacklist, never checked) will be counted as as unchecked and the number of unchecked links will therefore never become zero. +* #1321378: Improve performance of queries +* #953958: User able to see other user broken links +* #725398: variable_get() may not be available in the install.php run +* First decode, than filter as URLs could theoretically consist of encoded blanks only. +* #1067160 by somimi: Minor grammar fixes to some of the descriptions in linkchecker.pages.inc +* Removing translation directories +* #903318: Internal Links in cck, weblinks and links fields are not extracted. +* Remove locale module setUp as notices in _linkchecker_add_node_links() has been fixed. +* Prevent notices if tests run without locale module. +* #780242 by AlexisWilke: Several E_NOTICE when dealing with the URLs +* #500090 by hass: Block removal of RFC domains in exclude links +* #685580 by wheyse: CCK field_name need to be checked with empty() as the value could be empty +* Upgrade line break converter from D5 filter/2 to D6 filter/1. +* #661484: Empty URL exclusion list disables link checking + + +linkchecker 6.x-2.4, November 24, 2009 +-------------------------------------- + +* #566388 by wimh, hass: Re-check link status on next cron run +* #632732 by sleepcamel, hass: Add a message to $node->log when saving a new revision +* #627774 by charmer: Linkchecker Czech Translation +* Replace word "node" in text with "content" for easier translation +* #580248: Prevent link check failure if 'max_execution_time' = 0 (unlimited). +* Blacklisted "smileys/0" filter as the URLs are maintained in the Smiley module settings +* Fixed wrong variable name in single comment import function +* Updated README.txt +* Cleanup / refactoring _linkchecker_extract_links() +* #563464: Internal links reported as broken incorrectly on SSL only site. Use $base_root as site URL for prefixing absolute internal URLs. +* E_ALL saver... +* Better menu item description, D7 backport. +* Dynamic destination for user broken links page +* Use theme function for item_list +* Dynamic colspan for no data +* Joined wrong fields in user report with comments enabled +* Filters do not run on content as expected. +* db_last_insert_id('boxes', 'bid') could return a wrong value if other contrib modules add block hooks and insert something in other tables. +* Make all count() upper case +* Show items in a list +* Filter $link->error for arbitrary code +* #532178 by hass: Database update #6209 failed +* #196862 by hass: COUNT(*) is an expensive query in InnoDB. +* Added links extraction .test +* E_ALL: Fixed notice for undefined $node->language. +* E_ALL: Fixed notice caused by array_map(md5, $links) +* Typo fixed +* Changed unique key and column name 'token' into 'urlhash'. +* Added filter blacklist for link extraction. +* Remove reference to $form_state in hook_form_alter() +* Fix comments +* Add $node->type check +* Added support for node type 'weblinks' from 'weblinks' modules +* D5: check_plain() all '@' string values for the use with strtr(). + + +linkchecker 6.x-2.3, August 1, 2009 +----------------------------------- + +By this release linkchecker no longer depends on job_queue! + +* by wimh: Copy an paste error, used _linkchecker_node_links_missing() in _linkchecker_add_comment_links() +* #536744 by wimh, hass: Add broken links warning message to block edit page on view, but not after save. +* #536744 by wimh, hass: Fix comment edit form to show the broken links warning message only on 'view' and 'preview', but not after save. +* Fix inline documenation typos +* Code style, variable names, constant for limit, doc fixes, others +* #536672 by wimh, hass: Link references not updated when last link of a node/comment/block is removed +* More comments added. +* Updated translation files +* Use update_sql() for permission updates +* Save form settings on link scan and clear. +* #497096: Support links generated by input filter +* Remove duplicate lid's in SQL results +* #465414: Followup for relative links extracted incorrectly +* Note that custom link settings are lost on every clean and re-analyse task +* Added GUI for link check URL filter +* #524380: Do not check example.com/net/org domain links +* Updated installation steps in README.txt +* Added sample URLs for internal and external to description +* Changed permission name "access linkchecker" to "access broken links report" +* Added the status code 302 to the list of ignored response codes. +* Select from comment table only, if comment modules is active. +* Remove ignored links from broken links view + + +linkchecker 6.x-2.2, July 14, 2009 +---------------------------------- + +* Removed confusing watchdog message. +* Use default node type revision setting and save a revision on 301 auto-update. +* UX: Provide more descriptive help what the HTML tags are for. +* #451456: 301 auto-update could break links +* #452080: Update permanently moved internal links is broken +* Removed duplicate _linkchecker_add_xxx_links() calls. node_save automaticallly calls hook_nodeapi and comment_save automatically calls hook_comment with 'update'. +* Added a link to the job_queue module project page +* #465414: Stop incorrect extraction of relative links +* Typo fixed in batch finished message +* Removed unused default case +* Removed UI setting no longer having a real use case (and reduce complexity) +* Deleted the associated variable. +* One more chance to extract a URL (for e.g. Java Applet) +* Added support for HTML5 tags (video|audio|source) +* Uncomment cURL requirement until implemented. +* #402742: Integration with path_redirect +* #427906, #417354: Extract links from various configurable HTML tags (a|area|img|iframe|object|param|embed) +* #504332: Cannot install, HTTP request status fails +* Show edit link only if user have permission to change settings +* New permission to edit link settings +* Add UI to change request method +* Add ignore filter for links pointing to buggy servers + + +linkchecker 6.x-2.1, March 26, 2009 +----------------------------------- + +* #409324 by Dave Reid: _linkchecker_delete_node_links() expects a nid, but passed a node object +* #386612 by hass: Prevent possible cron failures caused by too many link checks +* #408860 by Dave Reid: PHP notice: Undefined property: stdClass::$moderate in linkchecker.module on line 428. +* #373485 by hass: DB errors when adding a new node +* #387228: linkchecker.module fails in PHP4 on line 910 +* #375767: Wrong table aliases and column names for comments and boxes +* Added MySQL 5.0 requirement check +* Show broken link message on node prepare, not view +* #380548: No results after configuration changes +* #380476: Descriptive text in Admin confusing +* #381986: Broken link does not immediately disappear in broken links list after link has been fixed in content +* #380872 by hass: Show informative message about current check status on reports page. diff --git a/dkan/modules/contrib/linkchecker/PATCHES.txt b/dkan/modules/contrib/linkchecker/PATCHES.txt new file mode 100644 index 000000000..53aace196 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/PATCHES.txt @@ -0,0 +1,5 @@ +The following patches have been applied to this project: +- https://www.drupal.org/files/issues/linkchecker-views-integration-965720-124.patch +- dkan_linkchecker_file.patch + +This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/linkchecker/README.txt b/dkan/modules/contrib/linkchecker/README.txt new file mode 100644 index 000000000..96c733be9 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/README.txt @@ -0,0 +1,51 @@ + +Link Checker +------------ + +Installation: + +1. Install linkchecker via Modules page. +2. Go to Modules and enable the "Link checker" module. +3. Go to Configuration -> Content authoring -> Link checker and enable the node types to scan. +4. Under "Link extraction" check all HTML tags that should be scanned. +5. Adjust the other settings if the defaults don't suit your needs. +6. Save configuration +7. Wait for cron to check all your links... this may take some time! :-) + +If links are broken they appear under Reports -> Broken links. + +If not, make sure cron is configured and running properly on your Drupal +installation. The Link checker module also logs somewhat useful info about it's +activity under Reports -> Recent log messages. + + +Required: + +1. For internal URL extraction you need to make sure that Cron always get called + with your real public site URL (for e.g. http://example.com/cron.php). Make + sure it's never executed with http://localhost/cron.php or any other + hostnames or ports, not available from public. Otherwise all links may be + reported as broken and cannot verified as they should be. + + To make sure it always works - it's required to configure the $base_url in + the sites settings.php with your public sites URL. Better safe than sorry! + + +Known issues: + +There are a lot of known issues in drupal_http_request(). These have been solved +in HTTPRL. As a workaround it's recommended to use HTTPRL in linkchecker. + +Issues list: + +* #997648: drupal_http_request() always calls fread() one more time than necessary +* #164365-12: drupal_http_request() does handle (invalid) non-absolute redirects +* #205969-11: drupal_http_request() assumes presence of Reason-Phrase in response Status-Line +* #371495: Error message from drupal_http_request() not UTF8 encoded +* #193073-11: drupal_http_request - socket not initialized +* #106506-8: drupal_http_request() does not handle 'chunked' responses - Make it support HTTP 1.1 +* #1096890-15: drupal_http_request should return error if reaches max allowed redirects +* #875342-21: drupal_http_request() should pick up X-Drupal-Assertion-* HTTP headers +* #965078-31: HTTP request checking is unreliable and should be removed in favor of watchdog() calls +* #336367: HTTP client should protect commas when folding (compatibility with legacy HTTP/1.0) +* #45338: log fsockopen errors to watchdog diff --git a/dkan/modules/contrib/linkchecker/dkan_linkchecker_file.patch b/dkan/modules/contrib/linkchecker/dkan_linkchecker_file.patch new file mode 100644 index 000000000..da9a3444e --- /dev/null +++ b/dkan/modules/contrib/linkchecker/dkan_linkchecker_file.patch @@ -0,0 +1,38 @@ +diff --git a/linkchecker.module b/linkchecker.module +index b7bbe3e..9b4b440 100644 +--- a/linkchecker.module ++++ b/linkchecker.module +@@ -333,6 +333,7 @@ function _linkchecker_link_node_ids($link, $node_author_account = NULL) { + 'text_long', + 'text', + 'link_field', ++ 'file', + ); + + // Only check link and text fields, since those are the only types we +@@ -1774,6 +1775,26 @@ function _linkchecker_parse_fields($entity_type, $bundle_name, $entity, $return_ + } + } + break; ++ ++ // File module field. ++ case 'file': ++ foreach ($entity_field as $language) { ++ foreach ($language as $item) { ++ $item += array( ++ 'title' => '', ++ ); ++ if (isset($item['uri'])) { ++ $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $item['uri']); ++ $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); ++ } ++ elseif (isset($item['filefield_dkan_remotefile']['url'])) { ++ $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $item['filefield_dkan_remotefile']['url']); ++ $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); ++ } ++ } ++ } ++ break; ++ + } + } diff --git a/dkan/modules/contrib/linkchecker/linkchecker-node-form.js b/dkan/modules/contrib/linkchecker/linkchecker-node-form.js new file mode 100644 index 000000000..1eef3e0d1 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker-node-form.js @@ -0,0 +1,19 @@ +(function ($) { + +Drupal.behaviors.linkcheckerFieldsetSummaries = { + attach: function (context) { + // Provide the vertical tab summaries. + $('fieldset#edit-linkchecker', context).drupalSetSummary(function(context) { + var vals = []; + $('input:checked', context).next('label').each(function() { + vals.push(Drupal.checkPlain($(this).text())); + }); + if (!vals.length) { + return Drupal.t('Disabled'); + } + return vals.join(', '); + }); + } +}; + +})(jQuery); diff --git a/dkan/modules/contrib/linkchecker/linkchecker.admin.inc b/dkan/modules/contrib/linkchecker/linkchecker.admin.inc new file mode 100644 index 000000000..78b411c2a --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.admin.inc @@ -0,0 +1,368 @@ +<?php + +/** + * @file + * Administrative page callbacks for the linkchecker module. + */ + +/** + * Implements hook_admin_settings_form(). + */ +function linkchecker_admin_settings_form($form_state) { + + $form['settings'] = array( + '#type' => 'fieldset', + '#title' => t('General settings'), + '#description' => t('Configure the <a href="@url">content types</a> that should be scanned for broken links.', array('@url' => url('admin/structure/types'))), + '#collapsible' => FALSE, + ); + + $block_custom_dependencies = '<div class="admin-requirements">'; + $block_custom_dependencies .= t('Requires: !module-list', array('!module-list' => (module_exists('block') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Block')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Block'))))); + $block_custom_dependencies .= '</div>'; + + $form['settings']['linkchecker_scan_blocks'] = array( + '#default_value' => variable_get('linkchecker_scan_blocks', 0), + '#type' => 'checkbox', + '#title' => t('Scan blocks for links'), + '#description' => t('Enable this checkbox if links in blocks should be checked.') . $block_custom_dependencies, + '#disabled' => module_exists('block') ? FALSE : TRUE, + ); + $form['settings']['linkchecker_check_links_types'] = array( + '#type' => 'select', + '#title' => t('What type of links should be checked?'), + '#description' => t('A full qualified link (http://example.com/foo/bar) to a page is considered external, whereas an absolute (/foo/bar) or relative link (node/123) without a domain is considered internal.'), + '#default_value' => variable_get('linkchecker_check_links_types', 1), + '#options' => array( + '0' => t('Internal and external'), + '1' => t('External only (http://example.com/foo/bar)'), + '2' => t('Internal only (node/123)'), + ), + ); + + $form['tag'] = array( + '#type' => 'fieldset', + '#title' => t('Link extraction'), + '#collapsible' => FALSE, + ); + $form['tag']['linkchecker_extract_from_a'] = array( + '#default_value' => variable_get('linkchecker_extract_from_a', 1), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><a></code> and <code><area></code> tags'), + '#description' => t('Enable this checkbox if normal hyperlinks should be extracted. The anchor element defines a hyperlink, the named target destination for a hyperlink, or both. The area element defines a hot-spot region on an image, and associates it with a hypertext link.'), + ); + $form['tag']['linkchecker_extract_from_audio'] = array( + '#default_value' => variable_get('linkchecker_extract_from_audio', 0), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><audio></code> tags including their <code><source></code> and <code><track></code> tags'), + '#description' => t('Enable this checkbox if links in audio tags should be extracted. The audio element is used to embed audio content.'), + ); + $form['tag']['linkchecker_extract_from_embed'] = array( + '#default_value' => variable_get('linkchecker_extract_from_embed', 0), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><embed></code> tags'), + '#description' => t('Enable this checkbox if links in embed tags should be extracted. This is an obsolete and non-standard element that was used for embedding plugins in past and should no longer used in modern websites.'), + ); + $form['tag']['linkchecker_extract_from_iframe'] = array( + '#default_value' => variable_get('linkchecker_extract_from_iframe', 0), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><iframe></code> tags'), + '#description' => t('Enable this checkbox if links in iframe tags should be extracted. The iframe element is used to embed another HTML page into a page.'), + ); + $form['tag']['linkchecker_extract_from_img'] = array( + '#default_value' => variable_get('linkchecker_extract_from_img', 0), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><img></code> tags'), + '#description' => t('Enable this checkbox if links in image tags should be extracted. The img element is used to add images to the content.'), + ); + $form['tag']['linkchecker_extract_from_object'] = array( + '#default_value' => variable_get('linkchecker_extract_from_object', 0), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><object></code> and <code><param></code> tags'), + '#description' => t('Enable this checkbox if multimedia and other links in object and their param tags should be extracted. The object tag is used for flash, java, quicktime and other applets.'), + ); + $form['tag']['linkchecker_extract_from_video'] = array( + '#default_value' => variable_get('linkchecker_extract_from_video', 0), + '#type' => 'checkbox', + '#title' => t('Extract links in <code><video></code> tags including their <code><source></code> and <code><track></code> tags'), + '#description' => t('Enable this checkbox if links in video tags should be extracted. The video element is used to embed video content.'), + ); + + // Get all filters available on the system. + $filter_info = filter_get_filters(); + $filter_options = array(); + foreach ($filter_info as $name => $filter) { + if (in_array($name, explode('|', LINKCHECKER_DEFAULT_FILTER_BLACKLIST))) { + $filter_options[$name] = t('!title <span class="form-required">(Recommended)</span>', array('!title' => $filter['title'])); + } + else { + $filter_options[$name] = $filter['title']; + } + } + $form['tag']['linkchecker_filter_blacklist'] = array( + '#type' => 'checkboxes', + '#title' => t('Filters disabled for link extraction'), + '#default_value' => variable_get('linkchecker_filter_blacklist', explode('|', LINKCHECKER_DEFAULT_FILTER_BLACKLIST)), + '#options' => $filter_options, + '#description' => t('If a filter has been enabled for an input format it runs first and afterwards the link extraction. This helps the link checker module to find all links normally created by custom filters (e.g. Markdown filter, Bbcode). All filters used as inline references (e.g. Weblink filter <code>[link: id]</code>) to other content and filters only wasting processing time (e.g. Line break converter) should be disabled. This setting does not have any effect on how content is shown on a page. This feature optimizes the internal link extraction process for link checker and prevents false alarms about broken links in content not having the real data of a link.'), + ); + + $count_lids_enabled = db_query("SELECT count(lid) FROM {linkchecker_link} WHERE status = :status", array(':status' => 1))->fetchField(); + $count_lids_disabled = db_query("SELECT count(lid) FROM {linkchecker_link} WHERE status = :status", array(':status' => 0))->fetchField(); + $form['check'] = array( + '#type' => 'fieldset', + '#title' => t('Check settings'), + '#description' => t('For simultaneous link checks it is recommended to install the <a href="@httprl">HTTP Parallel Request & Threading Library</a>. This may be <strong>necessary</strong> on larger sites with very many links (30.000+), but will also improve overall link check duration on smaller sites. Currently the site has @count links (@count_enabled enabled / @count_disabled disabled).', array('@httprl' => 'http://drupal.org/project/httprl', '@count' => $count_lids_enabled+$count_lids_disabled, '@count_enabled' => $count_lids_enabled, '@count_disabled' => $count_lids_disabled)), + '#collapsible' => FALSE, + ); + $form['check']['linkchecker_check_library'] = array( + '#type' => 'select', + '#title' => t('Check library'), + '#description' => t('Defines the library that is used for checking links.'), + '#default_value' => variable_get('linkchecker_check_library', 'core'), + '#options' => array( + 'core' => t('Drupal core'), + 'httprl' => t('HTTP Parallel Request & Threading Library'), + ), + ); + $form['check']['linkchecker_check_connections_max'] = array( + '#type' => 'select', + '#title' => t('Number of simultaneous connections'), + '#description' => t('Defines the maximum number of simultaneous connections that can be opened by the server. <em>HTTP Parallel Request & Threading Library</em> make sure that a single domain is not overloaded beyond RFC limits. For small hosting plans with very limited CPU and RAM it may be required to reduce the default limit.'), + '#default_value' => variable_get('linkchecker_check_connections_max', 8), + '#options' => drupal_map_assoc(array(2, 4, 8, 16, 24, 32, 48, 64, 96, 128)), + '#states' => array( + // Hide the setting when Drupal core check library is selected. + 'invisible' => array( + ':input[name="linkchecker_check_library"]' => array('value' => 'core'), + ), + ), + ); + $form['check']['linkchecker_check_useragent'] = array( + '#type' => 'select', + '#title' => t('User-Agent'), + '#description' => t('Defines the user agent that will be used for checking links on remote sites. If someone blocks the standard Drupal user agent you can try with a more common browser.'), + '#default_value' => variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)'), + '#options' => array( + 'Drupal (+http://drupal.org/)' => 'Drupal (+http://drupal.org/)', + 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko' => 'Windows 8.1 (x64), Internet Explorer 11.0', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586' => 'Windows 10 (x64), Edge', + 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0' => 'Windows 8.1 (x64), Mozilla Firefox 47.0', + 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0' => 'Windows 10 (x64), Mozilla Firefox 47.0', + ), + ); + $form['check']['linkchecker_check_links_interval'] = array( + '#type' => 'select', + '#title' => t('Check interval for links'), + '#description' => t('This interval setting defines how often cron will re-check the status of links.'), + '#default_value' => variable_get('linkchecker_check_links_interval', 2419200), + '#options' => drupal_map_assoc(array(86400, 172800, 259200, 604800, 1209600, 2419200, 4838400), 'format_interval'), + ); + $form['check']['linkchecker_disable_link_check_for_urls'] = array( + '#default_value' => variable_get('linkchecker_disable_link_check_for_urls', LINKCHECKER_RESERVED_DOCUMENTATION_DOMAINS), + '#type' => 'textarea', + '#title' => t('Do not check the link status of links containing these URLs'), + '#description' => t('By default this list contains the domain names reserved for use in documentation and not available for registration. See <a href="@rfc-2606">RFC 2606</a>, Section 3 for more information. URLs on this list are still extracted, but the link setting <em>Check link status</em> becomes automatically disabled to prevent false alarms. If you change this list you need to clear all link data and re-analyze your content. Otherwise this setting will only affect new links added after the configuration change.', array('@rfc-2606' => 'http://www.rfc-editor.org/rfc/rfc2606.txt')), + ); + $form['check']['linkchecker_log_level'] = array( + '#default_value' => variable_get('linkchecker_log_level', WATCHDOG_INFO), + '#type' => 'select', + '#title' => t('Log level'), + '#description' => t('Controls the severity of logging.'), + '#options' => array( + WATCHDOG_DEBUG => t('Debug messages'), + WATCHDOG_INFO => t('All messages (default)'), + WATCHDOG_NOTICE => t('Notices and errors'), + WATCHDOG_WARNING => t('Warnings and errors'), + WATCHDOG_ERROR => t('Errors only'), + ), + ); + + $form['error'] = array( + '#type' => 'fieldset', + '#title' => t('Error handling'), + '#description' => t('Defines error handling and custom actions to be executed if specific HTTP requests are failing.'), + '#collapsible' => FALSE, + ); + $linkchecker_default_impersonate_user = user_load(1); + $form['error']['linkchecker_impersonate_user'] = array( + '#type' => 'textfield', + '#title' => t('Impersonate user account'), + '#description' => t('If below error handling actions are executed they can be impersonated with a custom user account. By default this is user %name, but you are able to assign a custom user to allow easier identification of these automatic revision updates. Make sure you select a user with <em>full</em> permissions on your site or the user may not able to access and save all content.', array('%name' => $linkchecker_default_impersonate_user->name)), + '#size' => 30, + '#maxlength' => 60, + '#autocomplete_path' => 'user/autocomplete', + '#default_value' => variable_get('linkchecker_impersonate_user', ''), + ); + $form['error']['linkchecker_action_status_code_301'] = array( + '#title' => t('Update permanently moved links'), + '#description' => t('If enabled, outdated links in content providing a status <em>Moved Permanently</em> (status code 301) are automatically updated to the most recent URL. If used, it is recommended to use a value of <em>three</em> to make sure this is not only a temporarily change. This feature trust sites to provide a valid permanent redirect. A new content revision is automatically created on link updates if <em>create new revision</em> is enabled in the <a href="@content_types">content types</a> publishing options. It is recommended to create new revisions for all link checker enabled content types. Link updates are nevertheless always logged in <a href="@dblog">recent log entries</a>.', array('@dblog' => url('admin/reports/dblog'), '@content_types' => url('admin/structure/types'))), + '#type' => 'select', + '#default_value' => variable_get('linkchecker_action_status_code_301', 0), + '#options' => array( + 0 => t('Disabled'), + 1 => t('After one failed check'), + 2 => t('After two failed checks'), + 3 => t('After three failed checks'), + 5 => t('After five failed checks'), + 10 => t('After ten failed checks'), + ), + ); + $form['error']['linkchecker_action_status_code_404'] = array( + '#title' => t('Unpublish content on file not found error'), + '#description' => t('If enabled, content with one or more broken links (status code 404) will be unpublished and moved to moderation queue for review after the number of specified checks failed. If used, it is recommended to use a value of <em>three</em> to make sure this is not only a temporarily error.'), + '#type' => 'select', + '#default_value' => variable_get('linkchecker_action_status_code_404', 0), + '#options' => array( + 0 => t('Disabled'), + 1 => t('After one file not found error'), + 2 => t('After two file not found errors'), + 3 => t('After three file not found errors'), + 5 => t('After five file not found errors'), + 10 => t('After ten file not found errors'), + ), + ); + $form['error']['linkchecker_ignore_response_codes'] = array( + '#default_value' => variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"), + '#type' => 'textarea', + '#title' => t("Don't treat these response codes as errors"), + '#description' => t('One HTTP status code per line, e.g. 403.'), + ); + + // Buttons are only required for testing and debugging reasons. + $description = '<p>' . t('These actions will either clear all link checker tables in the database and/or analyze all selected content types, blocks and fields (see settings above) for new/updated/removed links. Normally there is no need to press one of these buttons. Use this only for immediate cleanup tasks and to force a full re-build of the links to be checked in the linkchecker tables. Keep in mind that all custom link settings will be lost if you clear link data!') . '</p>'; + $description .= '<p>' . t('<strong>Note</strong>: These functions ONLY collect the links, they do not evaluate the HTTP response codes, this will be done during normal cron runs.') . '</p>'; + + $form['clear'] = array( + '#type' => 'fieldset', + '#title' => t('Maintenance'), + '#description' => $description, + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['clear']['linkchecker_analyze'] = array( + '#type' => 'submit', + '#value' => t('Reanalyze content for links'), + '#submit' => array('linkchecker_analyze_links_submit'), + ); + $form['clear']['linkchecker_clear_analyze'] = array( + '#type' => 'submit', + '#value' => t('Clear link data and analyze content for links'), + '#submit' => array('linkchecker_clear_analyze_links_submit'), + ); + + $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration')); + $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults')); + + return $form; +} + +/** + * Implements hook_admin_settings_form_validate(). + */ +function linkchecker_admin_settings_form_validate($form, &$form_state) { + $form_state['values']['linkchecker_disable_link_check_for_urls'] = trim($form_state['values']['linkchecker_disable_link_check_for_urls']); + $form_state['values']['linkchecker_ignore_response_codes'] = trim($form_state['values']['linkchecker_ignore_response_codes']); + $ignore_response_codes = preg_split('/(\r\n?|\n)/', $form_state['values']['linkchecker_ignore_response_codes']); + foreach ($ignore_response_codes as $ignore_response_code) { + if (!_linkchecker_isvalid_response_code($ignore_response_code)) { + form_set_error('linkchecker_ignore_response_codes', t('Invalid response code %code found.', array('%code' => $ignore_response_code))); + } + } + + // Prevent the removal of RFC documentation domains. This are the official and + // reserved documentation domains and not "example" hostnames! + $linkchecker_disable_link_check_for_urls = array_filter(preg_split('/(\r\n?|\n)/', $form_state['values']['linkchecker_disable_link_check_for_urls'])); + $form_state['values']['linkchecker_disable_link_check_for_urls'] = implode("\n", array_unique(array_merge(explode("\n", LINKCHECKER_RESERVED_DOCUMENTATION_DOMAINS), $linkchecker_disable_link_check_for_urls))); + + // Validate impersonation user name. + $linkchecker_impersonate_user = user_load_by_name($form_state['values']['linkchecker_impersonate_user']); + if (empty($linkchecker_impersonate_user->uid)) { + form_set_error('linkchecker_impersonate_user', t('User account %name cannot found.', array('%name' => $form_state['values']['linkchecker_impersonate_user']))); + } +} + +/** + * Implements hook_admin_settings_form_submit(). + */ +function linkchecker_admin_settings_form_submit($form, &$form_state) { + // Exclude unnecessary elements. + unset($form_state['values']['linkchecker_analyze'], $form_state['values']['linkchecker_clear_analyze']); + + // Save form settings. + system_settings_form_submit($form, $form_state); + + // If block scanning has been selected. + if ($form_state['values']['linkchecker_scan_blocks'] > $form['settings']['linkchecker_scan_blocks']['#default_value']) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_block_custom()); + } +} + +/** + * Submit callback. + * + * Analyze fields in all node types, comments, custom blocks. + */ +function linkchecker_analyze_links_submit($form, &$form_state) { + // Exclude unnecessary elements. + unset($form_state['values']['linkchecker_analyze'], $form_state['values']['linkchecker_clear_analyze']); + + // Save form settings. + system_settings_form_submit($form, $form_state); + + // Start batch and analyze all nodes. + $node_types = linkchecker_scan_node_types(); + if (!empty($node_types)) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_nodes($node_types)); + } + + $comment_types = linkchecker_scan_comment_types(); + if (!empty($comment_types)) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_comments($comment_types)); + } + + if (variable_get('linkchecker_scan_blocks', 0)) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_block_custom()); + } +} + +/** + * Submit callback. + * + * Clear link data and analyze fields in all content types, comments, custom + * blocks. + */ +function linkchecker_clear_analyze_links_submit($form, &$form_state) { + // Exclude unnecessary elements. + unset($form_state['values']['linkchecker_analyze'], $form_state['values']['linkchecker_clear_analyze']); + + // Save form settings. + system_settings_form_submit($form, $form_state); + + db_truncate('linkchecker_block_custom')->execute(); + db_truncate('linkchecker_comment')->execute(); + db_truncate('linkchecker_node')->execute(); + db_truncate('linkchecker_link')->execute(); + + // Start batch and analyze all nodes. + $node_types = linkchecker_scan_node_types(); + if (!empty($node_types)) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_nodes($node_types)); + } + + $comment_types = linkchecker_scan_comment_types(); + if (!empty($comment_types)) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_comments($comment_types)); + } + + if (variable_get('linkchecker_scan_blocks', 0)) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_block_custom()); + } +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.batch.inc b/dkan/modules/contrib/linkchecker/linkchecker.batch.inc new file mode 100644 index 000000000..b8af795c9 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.batch.inc @@ -0,0 +1,365 @@ +<?php + +/** + * @file + * Batch API callbacks for the linkchecker module. + */ + +/** + * Batch: Scan nodes for links. + */ +function _linkchecker_batch_import_nodes($node_types = array()) { + // Get all active {node}.nid's. + $result = db_query('SELECT n.nid FROM {node} n WHERE n.status = :status AND n.type IN (:types) ORDER BY n.nid', array(':status' => 1, ':types' => $node_types)); + + $operations = array(); + foreach ($result as $row) { + $operations[] = array('_linkchecker_batch_node_import_op', array($row->nid)); + } + $batch = array( + 'file' => drupal_get_path('module', 'linkchecker') . '/linkchecker.batch.inc', + 'finished' => '_linkchecker_batch_node_import_finished', + 'operations' => $operations, + 'title' => t('Scanning for links'), + ); + + return $batch; +} + +/** + * Batch operation: Scan one by one node for links. + */ +function _linkchecker_batch_node_import_op($nid, &$context) { + // Load the node and scan for links. + $node = node_load($nid, NULL, TRUE); + _linkchecker_add_node_links($node); + + // Store results for post-processing in the finished callback. + $context['results'][] = $node->nid; + $context['message'] = t('Content: @title', array('@title' => $node->title)); +} + +/** + * Output node batch result messages. + * + * @param bool $success + * If scan completed successfully or not. + * @param int $results + * Number of nodes scanned. + * @param array $operations + * Array of functions called. + */ +function _linkchecker_batch_node_import_finished($success, $results, $operations) { + if ($success) { + $message = format_plural(count($results), 'One node has been scanned.', '@count nodes have been scanned.'); + } + else { + $message = t('Scanning for links in content has failed with an error.'); + } + drupal_set_message($message); +} + +/** + * Batch: Scan comments for links. + */ +function _linkchecker_batch_import_comments($node_types = array()) { + // Get all active {comment}.cid's. + $result = db_query('SELECT c.cid FROM {comment} c INNER JOIN {node} n ON c.nid = n.nid WHERE c.status = :cstatus AND n.status = :nstatus AND n.type IN (:types) ORDER BY c.cid', array(':cstatus' => COMMENT_PUBLISHED, ':nstatus' => 1, ':types' => $node_types)); + + $operations = array(); + foreach ($result as $row) { + $operations[] = array('_linkchecker_batch_comments_import_op', array($row->cid)); + } + $batch = array( + 'file' => drupal_get_path('module', 'linkchecker') . '/linkchecker.batch.inc', + 'finished' => '_linkchecker_batch_comments_import_finished', + 'operations' => $operations, + 'title' => t('Scanning for links'), + ); + + return $batch; +} + +/** + * Batch operation: Scan one by one comment for links. + */ +function _linkchecker_batch_comments_import_op($cid, &$context) { + // Load the comment and scan for links. + $comment = comment_load($cid); + _linkchecker_add_comment_links($comment); + + // Store results for post-processing in the finished callback. + $context['results'][] = $comment->cid; + $context['message'] = t('Comment: @title', array('@title' => $comment->subject)); +} + +/** + * Output comment batch result messages. + * + * @param bool $success + * If scan completed successfully or not. + * @param int $results + * Number of comments scanned. + * @param array $operations + * Array of functions called. + */ +function _linkchecker_batch_comments_import_finished($success, $results, $operations) { + if ($success) { + $message = format_plural(count($results), 'One comment has been scanned.', '@count comments have been scanned.'); + } + else { + $message = t('Scanning for links in comments have failed with an error.'); + } + drupal_set_message($message); +} + +/** + * Batch: Scan blocks for links. + */ +function _linkchecker_batch_import_block_custom() { + // Get all {block_custom}.bid's as block module suxxx and has no usable hooks. + $result = db_query('SELECT bid FROM {block_custom} ORDER BY bid'); + + $operations = array(); + foreach ($result as $row) { + $operations[] = array('_linkchecker_batch_import_block_custom_op', array($row->bid)); + } + $batch = array( + 'file' => drupal_get_path('module', 'linkchecker') . '/linkchecker.batch.inc', + 'finished' => '_linkchecker_batch_block_custom_import_finished', + 'operations' => $operations, + 'title' => t('Scanning for links'), + ); + + return $batch; +} + +/** + * Batch operation: Scan one by one block for links. + */ +function _linkchecker_batch_import_block_custom_op($bid, &$context) { + // Load the custom block and scan for links. + $block_custom = linkchecker_block_custom_block_get($bid); + _linkchecker_add_block_custom_links($block_custom, $block_custom->delta); + + // Store some result for post-processing in the finished callback. + $context['results'][] = $block_custom->delta; + $context['message'] = t('Block: @title', array('@title' => $block_custom->info)); +} + +/** + * Output block batch result messages. + * + * @param bool $success + * If scan completed successfully or not. + * @param int $results + * Number of blocks scanned. + * @param array $operations + * Array of functions called. + */ +function _linkchecker_batch_block_custom_import_finished($success, $results, $operations) { + if ($success) { + $message = format_plural(count($results), 'One block has been scanned.', '@count blocks have been scanned.'); + } + else { + $message = t('Scanning for links in blocks have failed with an error.'); + } + drupal_set_message($message); +} + +/** + * Recurring scans of a single node via batch API. + * + * @param int $nid + * The unique node id to scan for links. + * @param int $missing_links_count + * The number of links not yet added to linkchecker_links table. By this + * number the re-scan rounds are calulated. + * + * @return array + * The batch task definition. + */ +function _linkchecker_batch_import_single_node($nid, $missing_links_count) { + $operations = array(); + for ($i = 0; $i <= $missing_links_count; $i = $i + LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) { + $operations[] = array('_linkchecker_batch_single_node_import_op', array($nid)); + } + $batch = array( + 'file' => drupal_get_path('module', 'linkchecker') . '/linkchecker.batch.inc', + 'finished' => '_linkchecker_batch_single_node_import_finished', + 'operations' => $operations, + 'title' => t('Scanning for links'), + 'progress_message' => t('Remaining @remaining of @total scans.'), + ); + + return $batch; +} + +/** + * Run single node link extraction. + * + * @param int $nid + * Node ID. + * @param array $context + * Batch context array. + */ +function _linkchecker_batch_single_node_import_op($nid, &$context) { + // Load the node and scan for links. + $node = node_load($nid, NULL, TRUE); + _linkchecker_add_node_links($node, TRUE); + + // Store results for post-processing in the finished callback. + $context['results'][] = $node->nid; + $context['message'] = t('Content: @title', array('@title' => $node->title)); +} + +/** + * Output single node batch result messages. + * + * @param bool $success + * If scan completed successfully or not. + * @param int $results + * How often the node has been scanned. + * @param array $operations + * Array of functions called. + */ +function _linkchecker_batch_single_node_import_finished($success, $results, $operations) { + if ($success) { + $message = format_plural(count($results), 'Node @nid has been re-scanned once to collect all links.', 'Node @nid has been re-scanned @count times to collect all links.', array('@nid' => $results[0])); + } + else { + $message = t('Recurring scanning for links in node @nid has failed with an error.', array('@nid' => $results[0])); + } + drupal_set_message($message); +} + +/** + * Recurring scans of a single comment via batch API. + * + * @param int $cid + * The unique comment id to scan for links. + * @param int $missing_links_count + * The number of links not yet added to linkchecker_links table. By this + * number the re-scan rounds are calulated. + * + * @return array + * The batch task definition. + */ +function _linkchecker_batch_import_single_comment($cid, $missing_links_count) { + $operations = array(); + for ($i = 0; $i <= $missing_links_count; $i = $i + LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) { + $operations[] = array('_linkchecker_batch_single_comment_import_op', array($cid)); + } + $batch = array( + 'file' => drupal_get_path('module', 'linkchecker') . '/linkchecker.batch.inc', + 'finished' => '_linkchecker_batch_single_comment_import_finished', + 'operations' => $operations, + 'title' => t('Scanning for links'), + 'progress_message' => t('Remaining @remaining of @total scans.'), + ); + + return $batch; +} + +/** + * Run single comment link extraction. + * + * @param int $cid + * Comment ID. + * @param array $context + * Batch context array. + */ +function _linkchecker_batch_single_comment_import_op($cid, &$context) { + $comment = comment_load($cid); + _linkchecker_add_comment_links($comment, TRUE); + + // Store results for post-processing in the finished callback. + $context['results'][] = $comment->cid; + $context['message'] = t('Comment: @title', array('@title' => $comment->subject)); +} + +/** + * Output single comment batch result messages. + * + * @param bool $success + * If scan completed successfully or not. + * @param int $results + * How often the comment has been scanned. + * @param array $operations + * Array of functions called. + */ +function _linkchecker_batch_single_comment_import_finished($success, $results, $operations) { + if ($success) { + $message = format_plural(count($results), 'Comment @cid has been re-scanned once to collect all links.', 'Comment @cid has been re-scanned @count times to collect all links.', array('@cid' => $results[0])); + } + else { + $message = t('Recurring scanning for links in comment @cid has failed with an error.', array('@cid' => $results[0])); + } + drupal_set_message($message); +} + +/** + * Recurring scans of a single block via batch API. + * + * @param int $bid + * The unique block id to scan for links. + * @param int $missing_links_count + * The number of links not yet added to linkchecker_links table. By this + * number the re-scan rounds are calulated. + * + * @return array + * The batch task definition. + */ +function _linkchecker_batch_import_single_block_custom($bid, $missing_links_count) { + $operations = array(); + for ($i = 0; $i <= $missing_links_count; $i = $i + LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) { + $operations[] = array('_linkchecker_batch_single_block_custom_import_op', array($bid)); + } + $batch = array( + 'file' => drupal_get_path('module', 'linkchecker') . '/linkchecker.batch.inc', + 'finished' => '_linkchecker_batch_single_block_custom_import_finished', + 'operations' => $operations, + 'title' => t('Scanning for links'), + 'progress_message' => t('Remaining @remaining of @total scans.'), + ); + + return $batch; +} + +/** + * Run single block link extraction. + * + * @param int $bid + * Node ID. + * @param array $context + * Batch context array. + */ +function _linkchecker_batch_single_block_custom_import_op($bid, &$context) { + // Load the custom block and scan for links. + $block_custom = linkchecker_block_custom_block_get($bid); + _linkchecker_add_block_custom_links($block_custom, $block_custom->delta, TRUE); + + // Store some result for post-processing in the finished callback. + $context['results'][] = $block_custom->delta; + $context['message'] = t('Block: @title', array('@title' => $block_custom->info)); +} + +/** + * Output single block batch result messages. + * + * @param bool $success + * If scan completed successfully or not. + * @param int $results + * How often the block has been scanned. + * @param array $operations + * Array of functions called. + */ +function _linkchecker_batch_single_block_custom_import_finished($success, $results, $operations) { + if ($success) { + $message = format_plural(count($results), 'Block @bid has been re-scanned once to collect all links.', 'Block @bid has been re-scanned @count times to collect all links.', array('@bid' => $results[0])); + } + else { + $message = t('Recurring scanning for links in block @bid has failed with an error.', array('@bid' => $results[0])); + } + drupal_set_message($message); +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.drush.inc b/dkan/modules/contrib/linkchecker/linkchecker.drush.inc new file mode 100644 index 000000000..540bfd7a4 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.drush.inc @@ -0,0 +1,96 @@ +<?php + +/** + * @file + * Drush interface to linkchecker functionalities. + */ + +/** + * Implements hook_drush_command(). + */ +function linkchecker_drush_command() { + $commands = array(); + + $commands['linkchecker-analyze'] = array( + 'description' => 'Reanalyzes content for links. Recommended after module has been upgraded.', + ); + $commands['linkchecker-clear'] = array( + 'description' => 'Clears all link data and analyze content for links. WARNING: Custom link check settings are deleted.', + ); + $commands['linkchecker-check'] = array( + 'description' => 'Check link status.', + // 'options' => array( + // 'links' => 'Number of links to check in one round. Default: 1000', + // ), + ); + + return $commands; +} + +/** + * Callback for command linkchecker-analyze. + */ +function drush_linkchecker_analyze() { + global $base_url; + if ($base_url == 'http://default') { + drush_die('You MUST configure the site $base_url or provide --uri parameter.'); + } + + module_load_include('admin.inc', 'linkchecker'); + + // Fake $form_state to leverage _submit function. + $form_state = array( + 'values' => array('op' => t('Analyze content for links')), + 'buttons' => array(), + ); + + $node_types = linkchecker_scan_node_types(); + if (!empty($node_types) || variable_get('linkchecker_scan_blocks', 0)) { + linkchecker_analyze_links_submit(NULL, $form_state); + drush_backend_batch_process(); + } + else { + drush_log('No content configured for link analysis.', 'status'); + } +} + +/** + * Callback for command linkchecker-analyze. + */ +function drush_linkchecker_clear() { + global $base_url; + if ($base_url == 'http://default') { + drush_die('You MUST configure the site $base_url or provide --uri parameter.'); + } + + module_load_include('admin.inc', 'linkchecker'); + + // Fake $form_state to leverage _submit function. + $form_state = array( + 'values' => array('op' => t('Clear link data and analyze content for links')), + 'buttons' => array(), + ); + + $node_types = linkchecker_scan_node_types(); + if (!empty($node_types) || variable_get('linkchecker_scan_blocks', 0)) { + linkchecker_clear_analyze_links_submit(NULL, $form_state); + drush_backend_batch_process(); + } + else { + drush_log('No content configured for link analysis.', 'status'); + } +} + +/** + * Callback for command linkchecker-check. + */ +function drush_linkchecker_check() { + drush_log('Starting link checking...', 'info'); + $run = _linkchecker_check_links(); + if (!$run) { + drush_log('Attempted to re-run link checks while they are already running.', 'warning'); + } + else { + drush_log('Finished checking links.', 'completed'); + } +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.info b/dkan/modules/contrib/linkchecker/linkchecker.info new file mode 100644 index 000000000..3993fd83a --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.info @@ -0,0 +1,16 @@ +name = Link checker +description = "Periodically checks for broken links in node types, blocks and fields and reports the results." +configure = admin/config/content/linkchecker +core = 7.x +files[] = linkchecker.test +files[] = views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc +files[] = views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc +files[] = views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc +files[] = views/handlers/linkchecker_handler_field_linkchecker_link_url.inc +files[] = views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc +files[] = views/plugins/linkchecker_plugin_access.inc + +; Information added by drush on 2017-01-30 +version = "623819d04464b26af8e216113a88cd03f4bb4ccc" +project = "linkchecker" +datestamp = "1485787509" \ No newline at end of file diff --git a/dkan/modules/contrib/linkchecker/linkchecker.install b/dkan/modules/contrib/linkchecker/linkchecker.install new file mode 100644 index 000000000..14587a5dd --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.install @@ -0,0 +1,534 @@ +<?php + +/** + * @file + * Installation file for Link Checker module. + */ + +/** + * Implements hook_install(). + */ +function linkchecker_install() { + $linkchecker_default_impersonate_user = user_load(1); + variable_set('linkchecker_impersonate_user', $linkchecker_default_impersonate_user->name); +} + +/** + * Implements hook_uninstall(). + */ +function linkchecker_uninstall() { + variable_del('linkchecker_action_status_code_301'); + variable_del('linkchecker_action_status_code_404'); + variable_del('linkchecker_check_connections_max'); + variable_del('linkchecker_check_library'); + variable_del('linkchecker_check_links_interval'); + variable_del('linkchecker_check_links_types'); + variable_del('linkchecker_check_useragent'); + variable_del('linkchecker_cleanup_links_last'); + variable_del('linkchecker_disable_link_check_for_urls'); + variable_del('linkchecker_extract_from_a'); + variable_del('linkchecker_extract_from_audio'); + variable_del('linkchecker_extract_from_embed'); + variable_del('linkchecker_extract_from_iframe'); + variable_del('linkchecker_extract_from_img'); + variable_del('linkchecker_extract_from_object'); + variable_del('linkchecker_extract_from_video'); + variable_del('linkchecker_filter_blacklist'); + variable_del('linkchecker_ignore_response_codes'); + variable_del('linkchecker_impersonate_user'); + variable_del('linkchecker_scan_blocks'); + variable_del('linkchecker_log_level'); + + foreach (node_type_get_names() as $type => $name) { + variable_del('linkchecker_scan_node_' . $type); + variable_del('linkchecker_scan_comment_' . $type); + } +} + +/** + * Implements hook_schema(). + */ +function linkchecker_schema() { + + $schema['linkchecker_block_custom'] = array( + 'description' => 'Stores all link references for custom blocks.', + 'fields' => array( + 'bid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique {block_custom}.bid.', + ), + 'lid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique {linkchecker_link}.lid.', + ), + ), + 'primary key' => array('bid', 'lid'), + 'foreign keys' => array( + 'bid' => array( + 'table' => 'block_custom', + 'columns' => array('bid' => 'bid'), + ), + 'lid' => array( + 'table' => 'linkchecker_link', + 'columns' => array('lid' => 'lid'), + ), + ), + 'indexes' => array('lid' => array('lid')), + ); + + $schema['linkchecker_comment'] = array( + 'description' => 'Stores all link references for comments.', + 'fields' => array( + 'cid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique {comment}.cid.', + ), + 'lid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique {linkchecker_link}.lid.', + ), + ), + 'primary key' => array('cid', 'lid'), + 'foreign keys' => array( + 'cid' => array( + 'table' => 'comment', + 'columns' => array('cid' => 'cid'), + ), + 'lid' => array( + 'table' => 'linkchecker_link', + 'columns' => array('lid' => 'lid'), + ), + ), + 'indexes' => array('lid' => array('lid')), + ); + + $schema['linkchecker_node'] = array( + 'description' => 'Stores all link references for nodes.', + 'fields' => array( + 'nid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique {node}.nid.', + ), + 'lid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique {linkchecker_link}.lid.', + ), + ), + 'primary key' => array('nid', 'lid'), + 'foreign keys' => array( + 'nid' => array( + 'table' => 'node', + 'columns' => array('nid' => 'nid'), + ), + 'lid' => array( + 'table' => 'linkchecker_link', + 'columns' => array('lid' => 'lid'), + ), + ), + 'indexes' => array('lid' => array('lid')), + ); + + $schema['linkchecker_link'] = array( + 'description' => 'Stores all links.', + 'fields' => array( + 'lid' => array( + 'type' => 'serial', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique link ID.', + ), + 'urlhash' => array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'description' => 'The indexable hash of the {linkchecker_link}.url.', + ), + 'url' => array( + 'type' => 'text', + 'not null' => TRUE, + 'description' => 'The full qualified link.', + ), + 'method' => array( + 'type' => 'varchar', + 'length' => 4, + 'default' => 'HEAD', + 'not null' => TRUE, + 'description' => 'The method for checking links (HEAD, GET, POST).', + ), + 'code' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => -1, + 'description' => 'HTTP status code from link checking.', + ), + 'error' => array( + 'type' => 'text', + 'not null' => FALSE, + 'description' => 'The error message received from the remote server while doing link checking.', + ), + 'fail_count' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Fail count of unsuccessful link checks. No flapping detection. (Successful = 0, Unsuccessful = fail_count+1).', + ), + 'last_checked' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Timestamp of the last link check.', + ), + 'status' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 1, + 'description' => 'Boolean indicating if a link should be checked or not.', + ), + ), + 'primary key' => array('lid'), + 'unique keys' => array('urlhash' => array('urlhash')), + 'indexes' => array( + 'method' => array('method'), + 'code' => array('code'), + 'fail_count' => array('fail_count'), + 'last_checked' => array('last_checked'), + 'status' => array('status'), + ), + ); + + return $schema; +} + +/** + * If the core modules are disabled the integration need to be disabled. + */ +function linkchecker_modules_disabled($modules) { + // Disable link checks for custom blocks. + if (in_array('block', $modules)) { + variable_set('linkchecker_scan_blocks', 0); + drupal_set_message(t('Link checks for blocks have been disabled.')); + } + + // Disable link checks for comments. + if (in_array('comment', $modules)) { + foreach (node_type_get_names() as $type => $name) { + variable_del('linkchecker_scan_comment_' . $type); + } + drupal_set_message(t('Link checks for comments have been disabled.')); + } +} + +/** + * Rename database tables. + */ +function linkchecker_update_7000() { + db_rename_table('linkchecker_boxes', 'linkchecker_block_custom'); + db_rename_table('linkchecker_comments', 'linkchecker_comment'); + db_rename_table('linkchecker_nodes', 'linkchecker_node'); + db_rename_table('linkchecker_links', 'linkchecker_link'); + + return t('Renamed database tables to new schema names.'); +} + +/** + * Increase the size of 'urlhash' field for drupal_hash_base64() hashes. + */ +function linkchecker_update_7001() { + db_drop_unique_key('linkchecker_link', 'urlhash'); + + $spec = array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'description' => 'The indexable hash of the {linkchecker_link}.url.', + ); + + db_change_field('linkchecker_link', 'urlhash', 'urlhash', $spec, array('unique keys' => array('urlhash' => array('urlhash')))); + + return t('Extended data length of {linkchecker_link}.urlhash field.'); +} + +/** + * Recalculate the 'urlhash' using drupal_hash_base64(). + */ +function linkchecker_update_7002(&$sandbox) { + $sandbox['#finished'] = 0; + + // How many links are updated per batch run. + $count = 1000; + + // Count the number of links and chunks if not yet set and save to $sandbox + // to avoid a query on every batch run. + if (!isset($sandbox['chunk'])) { + // Count number of total links. + $links_total = db_query('SELECT COUNT(1) FROM {linkchecker_link}')->fetchField(); + // Calculate number of batch chunks. + $sandbox['total'] = ceil($links_total / $count); + // The current batch chunk, start at link number 0. + $sandbox['chunk'] = 0; + } + else { + // Recalculate the 'urlhash' using drupal_hash_base64(). + $has_rows = FALSE; + $result = db_query_range('SELECT url, lid FROM {linkchecker_link}', ($sandbox['chunk'] * $count), $count); + foreach ($result as $link) { + $has_rows = TRUE; + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array('urlhash' => drupal_hash_base64($link->url))) + ->execute(); + } + + // Increase current chunk number until batches are finished. + $sandbox['chunk']++; + $sandbox['#finished'] = 0.99; + + if (!$has_rows) { + $sandbox['#finished'] = 1; + return t("Recalculated the 'urlhash' using drupal_hash_base64()."); + } + } +} + +/** + * Issue #1321378: Improve performance of queries. + */ +function linkchecker_update_7003() { + db_drop_index('linkchecker_block_custom', 'lid'); + db_drop_index('linkchecker_comment', 'lid'); + db_drop_index('linkchecker_node', 'lid'); + + db_add_index('linkchecker_block_custom', 'lid', array('lid')); + db_add_index('linkchecker_comment', 'lid', array('lid')); + db_add_index('linkchecker_node', 'lid', array('lid')); + + return t('Added indexes to database tables.'); +} + +/** + * Add status code 206 to the default list of ignored response codes. + */ +function linkchecker_update_7004() { + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + if (!in_array('206', $ignore_response_codes)) { + $ignore_response_codes[] = '206'; + sort($ignore_response_codes); + variable_set('linkchecker_ignore_response_codes', implode("\n", $ignore_response_codes)); + return t('Added the status code 206 to the list of ignored response codes.'); + } + else { + return t('No action taken. The status code 206 was already on the list of ignored response codes.'); + } +} + +/** + * Upgrade from linkchecker_fqdn_only to linkchecker_check_links_types variable. + */ +function linkchecker_update_7005() { + + $linkchecker_fqdn_only = variable_get('linkchecker_fqdn_only', 1); + variable_set('linkchecker_check_links_types', $linkchecker_fqdn_only); + variable_del('linkchecker_fqdn_only'); + + return t('Upgraded "Check full qualified domain names only" to "What type of links should be checked" setting.'); +} + +/** + * Remove obsolete settings variable. + */ +function linkchecker_update_7006() { + // Remove obsolete variable. + variable_del('linkchecker_extract_from_source'); + + return t('Removed obsolete settings variable.'); +} + +/** + * Upgrade blacklisted internal filter names. + */ +function linkchecker_update_7007() { + // Available D7 filters (12/30/2011): + // + // - Line break converter, http://drupal.org/project/drupal + // name: filter_autop (D6: filter/1) + // - Insert block, http://drupal.org/project/insert_block + // name: insert_block (D6 insert_block/0) + // tags: [block:name of module=delta of block] + // - Insert view filter, http://drupal.org/project/insert_view + // name: insert_view (D6: insert_view/0) + + // See core filter_update_7003(); + // Get an array of the renamed filter deltas, organized by module. + $renamed_deltas = array( + 'filter' => array( + '0' => 'filter_html', + '1' => 'filter_autop', + '2' => 'filter_url', + '3' => 'filter_htmlcorrector', + '4' => 'filter_html_escape', + ), + 'php' => array( + '0' => 'php_code', + ), + 'gotwo' => array( + '0' => 'gotwo', + ), + 'insert_block' => array( + '0' => 'insert_block', + ), + 'insert_view' => array( + '0' => 'insert_view', + ), + 'smileys' => array( + '0' => 'smileys', + ), + ); + + // Manually load the linkchecker.module file or the constant may not defined. + drupal_load('module', 'linkchecker'); + + $linkchecker_filter_blacklist = variable_get('linkchecker_filter_blacklist', explode('|', LINKCHECKER_DEFAULT_FILTER_BLACKLIST)); + $linkchecker_filter_blacklist = array_values($linkchecker_filter_blacklist); + $linkchecker_filter_blacklist = array_filter($linkchecker_filter_blacklist); + + // Loop through each filter and make changes to the core filter name. + foreach ($renamed_deltas as $module => $deltas) { + foreach ($deltas as $old_delta => $new_name) { + if (in_array($module . '/' . $old_delta, $linkchecker_filter_blacklist)) { + $id = array_search($module . '/' . $old_delta, $linkchecker_filter_blacklist); + $linkchecker_filter_blacklist = array_replace($linkchecker_filter_blacklist, array($id => $new_name)); + } + } + } + + $linkchecker_filter_blacklist = drupal_map_assoc($linkchecker_filter_blacklist); + variable_set('linkchecker_filter_blacklist', $linkchecker_filter_blacklist); + + // This is not a 100% solution, but we tried the best... tell the admin. + return t('Updated the blacklisted internal filter names from Drupal 6 to Drupal 7. The update has only updated the blacklisted filters linkchecker is aware of. Please review the "Filters disabled for link extraction" settings, if all filters with <em>references</em> to other content are still disabled.'); +} + +/** + * Issue #965720: Add indexes to improve performance of views queries. + */ +function linkchecker_update_7008() { + db_drop_index('linkchecker_link', 'method'); + db_drop_index('linkchecker_link', 'code'); + db_drop_index('linkchecker_link', 'fail_count'); + db_drop_index('linkchecker_link', 'last_checked'); + db_drop_index('linkchecker_link', 'status'); + + db_add_index('linkchecker_link', 'method', array('method')); + db_add_index('linkchecker_link', 'code', array('code')); + db_add_index('linkchecker_link', 'fail_count', array('fail_count')); + db_add_index('linkchecker_link', 'last_checked', array('last_checked')); + db_add_index('linkchecker_link', 'status', array('status')); + + return t('Added indexes to linkchecker_link database table.'); +} + +/** + * Set user 1 as default user to impersonate content updates. + */ +function linkchecker_update_7009() { + // Do not overwrite D6 settings. + $linkchecker_impersonate_user = variable_get('linkchecker_impersonate_user', ''); + if (empty($linkchecker_impersonate_user)) { + $linkchecker_default_impersonate_user = user_load(1); + variable_set('linkchecker_impersonate_user', $linkchecker_default_impersonate_user->name); + } + + return t('Set user 1 as default user to impersonate content updates.'); +} + +/** + * Remove obsolete linkchecker_check_links_max variable. + */ +function linkchecker_update_7010() { + variable_del('linkchecker_check_links_max'); + + return t('Removed obsolete linkchecker_check_links_max variable.'); +} + +/** + * Upgrade outdated HTTP user agents. + */ +function linkchecker_update_7011() { + + $linkchecker_check_useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)'); + + $useragent_upgrade = array( + 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;)' => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)', + 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0;)' => 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)', + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', + 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5' => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', + ); + + if (isset($useragent_upgrade[$linkchecker_check_useragent])) { + variable_set('linkchecker_check_useragent', $useragent_upgrade[$linkchecker_check_useragent]); + return t('Upgraded outdated HTTP user agent from "@user_agent_old" to "@user_agent_new".', array('@user_agent_old' => $linkchecker_check_useragent, '@user_agent_new' => $useragent_upgrade[$linkchecker_check_useragent])); + } + else { + return t('User agent already up to date.'); + } +} + +/** + * Upgrade outdated HTTP user agents. + */ +function linkchecker_update_7012() { + + $linkchecker_check_useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)'); + + $useragent_upgrade = array( + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)' => 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko', + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586', + 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0' => 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0', + 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0' => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0', + ); + + if (isset($useragent_upgrade[$linkchecker_check_useragent])) { + variable_set('linkchecker_check_useragent', $useragent_upgrade[$linkchecker_check_useragent]); + return t('Upgraded outdated HTTP user agent from "@user_agent_old" to "@user_agent_new".', array('@user_agent_old' => $linkchecker_check_useragent, '@user_agent_new' => $useragent_upgrade[$linkchecker_check_useragent])); + } + else { + return t('User agent already up to date.'); + } +} + +/** + * Migrate node type and comment settings to content types settings. + */ +function linkchecker_update_7013() { + $types = array_keys(array_filter(variable_get('linkchecker_scan_nodetypes', array()))); + foreach ($types as $type) { + variable_set('linkchecker_scan_node_' . $type, TRUE); + if (variable_get('linkchecker_scan_comments', 0)) { + variable_set('linkchecker_scan_comment_' . $type, TRUE); + } + } + + variable_del('linkchecker_scan_nodetypes'); + variable_del('linkchecker_scan_comments'); + + return t('Upgraded node type and comment settings.'); +} + +if (!function_exists('array_replace')) { + /** + * PHP 5.3 backport for array_replace(). + */ + function array_replace() { + $array = array(); + $n = func_num_args(); + while ($n-- > 0) { + $array += func_get_arg($n); + } + return $array; + } +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.module b/dkan/modules/contrib/linkchecker/linkchecker.module new file mode 100644 index 000000000..25bcefd0b --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.module @@ -0,0 +1,2781 @@ +<?php + +/** + * @file + * This module periodically check links in given node types, blocks etc. + * + * Developed by Alexander Hass, http://www.yaml-for-drupal.com/. + */ + +/** + * Defines the maximum limit of links collected in one chunk if content is + * scanned for links. A value that is too high may overload the database server. + */ +define('LINKCHECKER_SCAN_MAX_LINKS_PER_RUN', '100'); + +/** + * A list of domain names reserved for use in documentation and not available + * for registration. See RFC 2606, Section 3 for more information. + */ +define('LINKCHECKER_RESERVED_DOCUMENTATION_DOMAINS', "example.com\nexample.net\nexample.org"); + +/** + * A list of blacklisted filters the modules do not need to run for the link + * extraction process. This filters only eat processing time or holds references + * to other nodes. + * + * - Line break converter, http://drupal.org/project/drupal + * name: filter_autop + * - Insert block, http://drupal.org/project/insert_block + * name: insert_block + * tags: [block:name of module=delta of block] + * - Insert view filter, http://drupal.org/project/insert_view + * name: insert_view + * tags: [view:my_view] + * - Smiley filter, http://drupal.org/project/smiley + * name: smiley + * tags: Depends on icon set, for e.g: ":) :-) :smile:" + * - Web Links Embed, http://drupal.org/project/weblinks + * name: weblinks_embed + * tags: [links-embed: id], [links-embed: name] + * - Web Links Filter, http://drupal.org/project/weblinks + * name: weblinks_filter + * tags: [link: title] + * + * @todo + * - Smileys Filter, http://drupal.org/project/smileys + * name: smileys + * tags: Depends on icon set, for e.g: ":) :-) :smile:" + * - Insert node, http://drupal.org/project/InsertNode + * name: insert_node/0 + * tags: [node:<name of node> <parameters>] + * - Weblink filter, http://drupal.org/project/links + * name: links_weblink/0 + * tags: [weblink:node_id|text], [weblink:node_id/link_id], [weblink:http://weblink.example.com/] + */ +define('LINKCHECKER_DEFAULT_FILTER_BLACKLIST', 'filter_autop|insert_block|insert_view|smiley|smileys|weblinks_embed|weblinks_filter'); + +/** + * Implements hook_permission(). + */ +function linkchecker_permission() { + return array( + 'access broken links report' => array( + 'title' => t('Access broken links report'), + 'description' => t('Allows users to access the global broken links report.'), + ), + 'access own broken links report' => array( + 'title' => t('Access own broken links report'), + 'description' => t('Allows users to access their user specific broken links report.'), + ), + 'administer linkchecker' => array( + 'title' => t('Administer linkchecker'), + 'description' => t('Allows users to administer linkchecker settings.'), + ), + 'edit link settings' => array( + 'title' => t('Edit link settings'), + 'description' => t('Allows users to edit broken link settings.'), + ), + ); +} + +/** + * Implements hook_help(). + */ +function linkchecker_help($path, $arg) { + switch ($path) { + case 'admin/help#linkchecker': + return '<p>' . t('This module provides an aid to finding broken links on your site. It periodically checks contents of all public nodes, tries to find any html links and check for their validity. It reports broken links through the admin interface. For more information about status codes see <a href="@rfc">Status Code Definitions</a>.', array('@rfc' => 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html')) . '</p>'; + } +} + +/** + * Implements hook_menu(). + */ +function linkchecker_menu() { + + $items['admin/config/content/linkchecker'] = array( + 'access arguments' => array('administer linkchecker'), + 'description' => 'Configure the content types that should be checked for broken links and how the hypertext links will be checked and reported and repaired.', + 'file' => 'linkchecker.admin.inc', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('linkchecker_admin_settings_form'), + 'title' => 'Link checker', + ); + $items['admin/reports/linkchecker'] = array( + 'access callback' => '_linkchecker_access', + 'description' => 'Shows a list of broken links in content.', + 'file' => 'linkchecker.pages.inc', + 'page callback' => 'linkchecker_admin_report_page', + 'title' => 'Broken links', + 'type' => MENU_NORMAL_ITEM, + 'weight' => 1, + ); + // Add the user menu item after node/edit tab. + $items['user/%user/linkchecker'] = array( + 'access callback' => '_linkchecker_access', + 'access arguments' => array(1), + 'description' => 'Shows a list of broken links in content.', + 'file' => 'linkchecker.pages.inc', + 'page callback' => 'linkchecker_user_report_page', + 'page arguments' => array(1), + 'title' => 'Broken links', + 'type' => MENU_LOCAL_TASK, + 'weight' => 3, + ); + $items['linkchecker/%linkchecker_link/edit'] = array( + 'access callback' => '_linkchecker_access_edit_link_settings', + 'access arguments' => array(1), + 'file' => 'linkchecker.pages.inc', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('linkchecker_link_edit_form', 1), + 'title' => 'Edit link settings', + 'type' => MENU_CALLBACK, + ); + + return $items; +} + +/** + * Implements hook_admin_paths(). + */ +function linkchecker_admin_paths() { + $paths = array( + // This is marked as an administrative path so that if it is visited from + // within the overlay, the user will stay within the overlay while the + // callback is being processed. + 'user/*/linkchecker' => TRUE, + 'linkchecker/*/edit' => TRUE, + ); + return $paths; +} + +/** + * Conditionally logs a system message. + * + * @param $type + * The category to which this message belongs. Can be any string, but the + * general practice is to use the name of the module calling watchdog(). + * @param $message + * The message to store in the log. Keep $message translatable + * by not concatenating dynamic values into it! Variables in the + * message should be added by using placeholder strings alongside + * the variables argument to declare the value of the placeholders. + * See t() for documentation on how $message and $variables interact. + * @param $variables + * Array of variables to replace in the message on display or + * NULL if message is already translated or not possible to + * translate. + * @param $severity + * The severity of the message; one of the following values as defined in + * @link http://www.faqs.org/rfcs/rfc3164.html RFC 3164: @endlink + * - WATCHDOG_EMERGENCY: Emergency, system is unusable. + * - WATCHDOG_ALERT: Alert, action must be taken immediately. + * - WATCHDOG_CRITICAL: Critical conditions. + * - WATCHDOG_ERROR: Error conditions. + * - WATCHDOG_WARNING: Warning conditions. + * - WATCHDOG_NOTICE: (default) Normal but significant conditions. + * - WATCHDOG_INFO: Informational messages. + * - WATCHDOG_DEBUG: Debug-level messages. + * @param $link + * A link to associate with the message. + * + * @see watchdog_severity_levels() + * @see watchdog() + */ +function linkchecker_watchdog_log($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) { + if ($severity <= variable_get('linkchecker_log_level', WATCHDOG_INFO)) { + watchdog($type, $message, $variables, $severity, $link); + } +} + +/** + * Access callback for user/%user/linkchecker. + * + * @param object $account + * The user account. + * + * @return int|bool + */ +function _linkchecker_access($account = NULL) { + global $user; + + if (!$account && arg(0) == 'user' && is_numeric(arg(1))) { + $account = user_load(arg(1)); + } + + // Users with 'access own broken links report' permission can only view their + // own report. Users with the 'access broken links report' permission can + // view the report for any authenticated user. + return (!empty($account->uid) && $user->uid == $account->uid && user_access('access own broken links report')) || user_access('access broken links report'); +} + +/** + * Access callback for linkchecker/%linkchecker_link/edit. + * + * @param object $link + * An object representing the link to check. + * + * @return bool + * TRUE if the current user has the requested permission. + */ +function _linkchecker_access_edit_link_settings($link) { + return user_access('access broken links report') || (user_access('edit link settings') && _linkchecker_link_access($link)); +} + +/** + * Determines if the current user has access to view a link. + * + * Link URLs can contain private information (for example, usernames and + * passwords). So this module should only display links to a user if the link + * already appears in at least one place on the site where the user would + * otherwise have access to see it. + * + * @param object $link + * An object representing the link to check. + * + * @return array + */ +function _linkchecker_link_access($link) { + $link = (object) $link; + return _linkchecker_link_node_ids($link) || _linkchecker_link_comment_ids($link) || _linkchecker_link_block_ids($link); +} + +/** + * Returns IDs of nodes that contain a link which the current user may be allowed to view. + * + * Important note: For performance reasons, this function is not always + * guaranteed to return the exact list of node IDs that the current user is + * allowed to view. It will, however, always return an empty array if the user + * does not have access to view *any* such nodes, thereby meeting the security + * goals of _linkchecker_link_access() and other places that call it. + * + * In the case where a user has access to some of the nodes that contain the + * link, this function may return some node IDs that the user does not have + * access to. Therefore, use caution with its results. + * + * @param object $link + * An object representing the link to check. + * @param object $node_author_account + * (optional) If a user account object is provided, the returned nodes will + * additionally be restricted to only those owned by this account. Otherwise, + * nodes owned by any user account may be returned. + * + * @return array + * An array of node IDs that contain the provided link and that the current + * user may be allowed to view. + */ +function _linkchecker_link_node_ids($link, $node_author_account = NULL) { + static $fields_with_node_links = array(); + + // Exit if all node types are disabled or if the user cannot access content, + // there is no need to check further. + $linkchecker_scan_nodetypes = linkchecker_scan_node_types(); + if (empty($linkchecker_scan_nodetypes) || !user_access('access content')) { + return array(); + } + + // Get a list of nodes containing the link, using addTag('node_access') to + // allow node access modules to exclude nodes that the current user does not + // have access to view. + if (!empty($node_author_account)) { + $query = db_select('node', 'n'); + $query->addTag('node_access'); + $query->innerJoin('linkchecker_node', 'ln', 'ln.nid = n.nid'); + $query->innerJoin('node_revision', 'r', 'r.vid = n.vid'); + $query->condition('ln.lid', $link->lid); + $query->condition(db_or() + ->condition('n.uid', $node_author_account->uid) + ->condition('r.uid', $node_author_account->uid) + ); + $query->fields('n', array('nid')); + } + else { + $query = db_select('node', 'n'); + $query->addTag('node_access'); + $query->innerJoin('linkchecker_node', 'ln', 'ln.nid = n.nid'); + $query->condition('ln.lid', $link->lid); + $query->fields('n', array('nid')); + } + $nodes = $query->execute(); + + // Check if the current user has access to view the link in each node. + // However, for performance reasons, as soon as we find one node where that + // is the case, stop checking and return the remainder of the list. + $nids = array(); + $access_allowed = FALSE; + foreach ($nodes as $node) { + if ($access_allowed) { + $nids[] = $node->nid; + continue; + } + $node = node_load($node->nid); + + // We must check whether the link is currently part of the node; if not, we + // do not want to return it (and it is not safe to, since we cannot know if + // it contained access restrictions for the current user at the point which + // it was originally extracted by the Link checker module). + if (!isset($fields_with_node_links[$node->nid])) { + $fields_with_node_links[$node->nid] = _linkchecker_extract_node_links($node, TRUE); + } + if (empty($fields_with_node_links[$node->nid][$link->url])) { + continue; + } + // If the link appears in fields and a field access module is being used, + // we must check that the current user has access to view at least one field + // that contains the link; if they don't, we should not return the node. + $fields = $fields_with_node_links[$node->nid][$link->url]; + if (module_implements('field_access')) { + $fields_with_access = array(); + + $bundle_instances = field_info_instances('node', $node->type); + foreach ($bundle_instances as $field_name => $field_instance) { + $field = field_info_field($field_name); + + // Field types supported by linkchecker. + $fields_supported = array( + 'text_with_summary', + 'text_long', + 'text', + 'link_field', + 'file', + ); + + // Only check link and text fields, since those are the only types we + // extract links from. + if (in_array($field['type'], $fields_supported) && field_access('view', $field, 'node', $node)) { + $fields_with_access[] = $field['field_name']; + } + } + if (!array_intersect($fields, $fields_with_access)) { + continue; + } + } + $nids[] = $node->nid; + $access_allowed = TRUE; + } + + return $nids; +} + +/** + * Returns IDs of comments that contain a link which the current user is allowed to view. + * + * @param object $link + * An object representing the link to check. + * @param object $comment_author_account + * (optional) If a user account object is provided, the returned comments + * will additionally be restricted to only those owned by this account. + * Otherwise, comments owned by any user account may be returned. + * + * @return array + * An array of comment IDs that contain the provided link and that the + * current user is allowed to view. + */ +function _linkchecker_link_comment_ids($link, $comment_author_account = NULL) { + // Exit if comments are disabled or if the user cannot access comments, there + // is no need to check further. + $comment_types = linkchecker_scan_comment_types(); + if (empty($comment_types) || !user_access('access comments')) { + return array(); + } + + // Get a list of comments containing the link, using addTag('node_access') to + // allow comment access modules to exclude comments that the current user + // does not have access to view. + if (!empty($comment_author_account)) { + $query = db_select('comment', 'c'); + $query->addMetaData('base_table', 'comment'); + $query->addTag('node_access'); + $query->innerJoin('linkchecker_comment', 'lc', 'lc.cid = c.cid'); + $query->condition('lc.lid', $link->lid); + $query->condition('c.uid', $comment_author_account->uid); + $query->fields('c', array('cid')); + } + else { + $query = db_select('comment', 'c'); + $query->addMetaData('base_table', 'comment'); + $query->addTag('node_access'); + $query->innerJoin('linkchecker_comment', 'lc', 'lc.cid = c.cid'); + $query->condition('lc.lid', $link->lid); + $query->fields('c', array('cid')); + } + $cids = $query->execute()->fetchCol(); + + // Return the array of comment IDs. + return $cids; +} + +/** + * Returns IDs of blocks that contain a link which the current user is allowed to view. + * + * @param object $link + * An object representing the link to check. + * + * @return array + * An array of custom block IDs that contain the provided link and that the + * current user is allowed to view. + */ +function _linkchecker_link_block_ids($link) { + // Exit if blocks are disabled. + if (!variable_get('linkchecker_scan_blocks', 0)) { + return array(); + } + + // Get the initial list of block IDs. + $bids = db_query('SELECT bid FROM {linkchecker_block_custom} WHERE lid = :lid', array(':lid' => $link->lid))->fetchCol(); + + // If the user can administer blocks, they're able to see all block content. + if (user_access('administer blocks')) { + return $bids; + } + + // Otherwise, only return blocks that this user (or anonymous users) have + // access to. + global $user; + $rids = array_keys($user->roles); + $rids[] = DRUPAL_ANONYMOUS_RID; + + $query = db_select('block', 'b'); + $query->leftJoin('block_role', 'r', 'b.module = r.module AND b.delta = r.delta'); + $query->condition('b.module', 'block'); + $query->condition(db_or() + ->condition('r.rid', $rids, 'IN') + ->isNull('r.rid') + ); + $query->fields('b', array('delta')); + $query->distinct(); + $allowed_bids = $query->execute()->fetchCol(); + + return array_intersect($bids, $allowed_bids); +} + +/** + * Implements hook_cron(). + */ +function linkchecker_cron() { + // Remove outdated links no longer in use once per day. + if (REQUEST_TIME - variable_get('linkchecker_cleanup_links_last', 0) >= 86400) { + _linkchecker_cleanup_links(); + variable_set('linkchecker_cleanup_links_last', REQUEST_TIME); + } + + // Run link checker in a new process, independent of cron. + if (module_exists('httprl') && variable_get('linkchecker_check_library', 'core') == 'httprl') { + // Setup callback options array; call _linkchecker_check_links() in the + // background. + $callback_options = array(array('function' => '_linkchecker_check_links')); + // Queue up the request. + httprl_queue_background_callback($callback_options); + // Execute request. + httprl_send_request(); + + // Exit here so we don't call _linkchecker_check_links() in this process. + return; + } + // Run the link checks the normal way. + _linkchecker_check_links(); +} + +/** + * Run link checks. + */ +function _linkchecker_check_links() { + // Get max_execution_time from configuration, override 0 with 240 seconds. + $max_execution_time = ini_get('max_execution_time') == 0 ? 240 : ini_get('max_execution_time'); + // Make sure we have enough time to validate all of the links. + drupal_set_time_limit($max_execution_time); + + // Make sure this is the only process trying to run this function. + if (!lock_acquire(__FUNCTION__, $max_execution_time)) { + linkchecker_watchdog_log('linkchecker', 'Attempted to re-run link checks while they are already running.', array(), WATCHDOG_WARNING); + return FALSE; + } + + $has_httprl = (module_exists('httprl') && variable_get('linkchecker_check_library', 'core') == 'httprl'); + + // Do not confuse admins with a setting of maximum checkable links per cron + // run and guess that 2 links can be checked per second with 1 thread, what is + // nevertheless uncommon. The max_execution_time can be used to calculate + // a useful value that is higher, but not totally out of scope and limits the + // query result set to a reasonable size. + $linkchecker_check_connections_max = variable_get('linkchecker_check_connections_max', 8); + $check_links_max_per_cron_run = ($has_httprl) ? ($linkchecker_check_connections_max * $max_execution_time) : $max_execution_time; + + $linkchecker_check_links_interval = variable_get('linkchecker_check_links_interval', 2419200); + $linkchecker_check_useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)'); + + // Connection limit can be overridden via settings.php. Two connections is the + // limit defined in RFC http://www.ietf.org/rfc/rfc2616.txt. Modern browsers + // are typically using 6-8 connections and no more. Never use more and keep + // in mind that you can overload other people servers. + $linkchecker_check_domain_connections = variable_get('linkchecker_check_domain_connections', 2); + + // Get URLs for checking. + $links = db_query_range('SELECT * FROM {linkchecker_link} WHERE last_checked < :last_checked AND status = :status ORDER BY last_checked, lid ASC', 0, $check_links_max_per_cron_run, array(':last_checked' => REQUEST_TIME - $linkchecker_check_links_interval, ':status' => 1)); + $links_remaining = $links->rowCount(); + + foreach ($links as $link) { + $headers = array(); + $headers['User-Agent'] = $linkchecker_check_useragent; + + $uri = @parse_url($link->url); + + // URL contains a fragment. + if (in_array($link->method, array('HEAD', 'GET')) && !empty($uri['fragment'])) { + // We need the full content and not only the HEAD. + $link->method = 'GET'; + // Request text content only (like Firefox/Chrome). + $headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; + } + elseif ($link->method == 'GET') { + // Range: Only request the first 1024 bytes from remote server. This is + // required to prevent timeouts on URLs that are large downloads. + $headers['Range'] = 'bytes=0-1024'; + } + + // Add in the headers. + $options = array( + 'headers' => $headers, + 'method' => $link->method, + 'max_redirects' => 0, + ); + + if ($has_httprl) { + // Define the callback and add the $link object to it. + // Notes: + // - 'global_timeout' does not require a timer_read('page'), as this job + // runs in a new process, independent of cron. + $options += array( + 'global_connections' => $linkchecker_check_connections_max, + 'global_timeout' => $max_execution_time - 30, + 'domain_connections' => $linkchecker_check_domain_connections, + 'callback' => array( + array( + 'function' => '_linkchecker_status_handling', + ), + $link, // This need to be passed or it's not send back to _linkchecker_status_handling() + ), + ); + // Queue up the requests. + httprl_request($link->url, $options); + $links_remaining--; + + // After all links are queued, run the url checks. + if ($links_remaining == 0) { + httprl_send_request(); + } + } + else { + // Drupal core. + $response = drupal_http_request($link->url, $options); + + // Add 'redirect_code' property to core response object for consistency + // with HTTPRL object. + if ($response->code == 301 && !isset($response->redirect_code)) { + $response->redirect_code = $response->code; + } + // Add 'uri' property to core response object for 'fragment' check and + // consistency with HTTPRL object. + $response->uri = $uri; + + _linkchecker_status_handling($response, $link); + + if ((timer_read('page') / 1000) > ($max_execution_time / 2)) { + // Stop once we have used over half of the maximum execution time. + break; + } + } + } + + // Release the lock. + lock_release(__FUNCTION__); + linkchecker_watchdog_log('linkchecker', 'Link checks completed.', array(), WATCHDOG_INFO); + linkchecker_watchdog_log('linkchecker', 'Memory usage: @memory_get_usage, Peak memory usage: @memory_get_peak_usage.', array('@memory_get_peak_usage' => format_size(memory_get_peak_usage()), '@memory_get_usage' => format_size(memory_get_usage())), WATCHDOG_DEBUG); + return TRUE; +} + +/** + * Status code handling. + * + * @param object $response + * An object containing the HTTP request headers, response code, headers, + * data and redirect status. + * @param string $link + * An object containing the url, lid and fail_count. + */ +function _linkchecker_status_handling(&$response, $link) { + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + + // - Prevent E_ALL warnings in DB updates for non-existing $response->error. + // - @todo drupal_http_request() may not provide an UTF8 encoded error message + // what results in a database UPDATE failure. For more information, see + // http://drupal.org/node/371495. + // Workaround: ISO-8859-1 as source encoding may be wrong, but WFM. + if (!isset($response->error)) { + $response->error = ''; + } + if (!isset($response->status_message)) { + $response->status_message = ''; + } + $response->error = trim(drupal_convert_to_utf8($response->error, 'ISO-8859-1')); + $response->status_message = trim(drupal_convert_to_utf8($response->status_message, 'ISO-8859-1')); + + // Destination anchors in HTML documents may be specified either by: + // - the A element (naming it with the name attribute) + // - or by any other element (naming with the id attribute) + // - and must not contain a key/value pair as these type of hash fragments are + // typically used by AJAX applications to prevent additionally HTTP requests + // e.g. http://www.example.com/ajax.html#key1=value1&key2=value2 + // - and must not contain '/' or ',' as this are not normal anchors. + // - and '#top' is a reserved fragment that must not exist in a page. + // See http://www.w3.org/TR/html401/struct/links.html + if ($response->code == 200 + && !empty($response->data) + && !empty($response->headers['content-type']) + && !empty($response->uri['fragment']) + && preg_match('/=|\/|,/', $response->uri['fragment']) == FALSE + && !in_array($response->uri['fragment'], array('#top')) + && in_array($response->headers['content-type'], array('text/html', 'application/xhtml+xml', 'application/xml')) + && !preg_match('/(\s[^>]*(name|id)(\s+)?=(\s+)?["\'])(' . preg_quote($response->uri['fragment'], '/') . ')(["\'][^>]*>)/i', $response->data) + ) { + // Override status code 200 with status code 404 so it can be handled with + // default status code 404 logic and custom error text. + $response->code = 404; + $response->status_message = $response->error = 'URL fragment identifier not found in content'; + } + + switch ($response->code) { + case -4: // HTTPRL: httprl_send_request timed out. + // Skip these and try them again next cron run. + break; + + case -2: // HTTPRL: maximum allowed redirects exhausted. + case 301: + // Remote site send status code 301 and link needs an update. + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'code' => $response->redirect_code, + 'error' => $response->status_message, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->expression('fail_count', 'fail_count + 1') + ->execute(); + + // A HTTP status code of 301 tells us an existing link have changed to + // a new link. The remote site owner was so kind to provide us the new + // link and if we trust this change we are able to replace the old link + // with the new one without any hand work. + $auto_repair_301 = variable_get('linkchecker_action_status_code_301', 0); + if ($auto_repair_301 && $auto_repair_301 <= ($link->fail_count + 1) && valid_url($response->redirect_url, TRUE)) { + // Switch anonymous user to an admin. + linkchecker_impersonate_user(user_load_by_name(variable_get('linkchecker_impersonate_user', ''))); + + // NODES: Autorepair all nodes having this outdated link. + $result = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $link->lid)); + foreach ($result as $row) { + // Explicitly don't use node_load_multiple() or the module may run + // into issues like http://drupal.org/node/1210606. With this logic + // nodes can be updated until an out of memory occurs and further + // updates will be made on the remaining nodes only. + $node = node_load($row->nid); + + // Has the node object loaded successfully? + if (is_object($node)) { + $node_original = clone $node; + $node = _linkchecker_replace_fields('node', $node->type, $node, $link->url, $response->redirect_url); + + if ($node_original != $node) { + // Always use the default revision setting. For more information, + // see node_object_prepare(). + $node_options = variable_get('node_options_' . $node->type, array('status', 'promote')); + $node->revision = in_array('revision', $node_options); + + // Generate a log message for the node_revisions table, visible on + // the node's revisions tab. + $node->log = t('Changed permanently moved link in %node from %src to %dst.', array('%node' => url('node/' . $node->nid), '%src' => $link->url, '%dst' => $response->redirect_url)); + + // Save changed node and update the node link list. + node_save($node); + linkchecker_watchdog_log('linkchecker', 'Changed permanently moved link in %node from %src to %dst.', array('%node' => url('node/' . $node->nid), '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO); + } + else { + linkchecker_watchdog_log('linkchecker', 'Link update in node failed. Permanently moved link %src not found in node %node. Manual fix required.', array('%node' => url('node/' . $row->nid), '%src' => $link->url), WATCHDOG_WARNING); + } + } + else { + linkchecker_watchdog_log('linkchecker', 'Loading node %node for update failed. Manual fix required.', array('%node' => $row->nid), WATCHDOG_ERROR); + } + } + + // COMMENTS: Autorepair all comments having this outdated link. + $result = db_query('SELECT cid FROM {linkchecker_comment} WHERE lid = :lid', array(':lid' => $link->lid)); + foreach ($result as $row) { + // Explicitly don't use comment_load_multiple() or the module may run + // into issues like http://drupal.org/node/1210606. With this logic + // comment can be updated until an out of memory occurs and further + // updates will be made on the remaining comments only. + $comment = comment_load($row->cid); + + // Has the comment object loaded successfully? + if (is_object($comment)) { + $comment_original = clone $comment; + + // Replace links in subject. + _linkchecker_link_replace($comment->subject, $link->url, $response->redirect_url); + + // Replace links in fields. + $comment = _linkchecker_replace_fields('comment', $comment->node_type, $comment, $link->url, $response->redirect_url); + + // Save changed comment and update the comment link list. + if ($comment_original != $comment) { + comment_save($comment); + linkchecker_watchdog_log('linkchecker', 'Changed permanently moved link in comment %comment from %src to %dst.', array('%comment' => $comment->cid, '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO); + } + else { + linkchecker_watchdog_log('linkchecker', 'Link update in comment failed. Permanently moved link %src not found in comment %comment. Manual fix required.', array('%comment' => $comment->cid, '%src' => $link->url), WATCHDOG_WARNING); + } + } + else { + linkchecker_watchdog_log('linkchecker', 'Loading comment %comment for update failed. Manual fix required.', array('%comment' => $comment->cid), WATCHDOG_ERROR); + } + } + + // CUSTOM BLOCKS: Autorepair all custom blocks having this outdated + // link. + $result = db_query('SELECT bid FROM {linkchecker_block_custom} WHERE lid = :lid', array(':lid' => $link->lid)); + foreach ($result as $row) { + $block_custom = linkchecker_block_custom_block_get($row->bid); + + // Has the custom block object loaded successfully? + if (is_object($block_custom)) { + $block_custom_original = clone $block_custom; + + // Now replace the outdated link with the permanently moved one in + // all custom block fields. + _linkchecker_link_replace($block_custom->info, $link->url, $response->redirect_url); + _linkchecker_link_replace($block_custom->body['value'], $link->url, $response->redirect_url); + + if ($block_custom_original != $block_custom) { + // Save changed block and update the block link list. + block_custom_block_save((array) $block_custom, $block_custom->delta); + // There is no hook that fires on block_custom_block_save(), + // therefore do link extraction programmatically. + _linkchecker_add_block_custom_links($block_custom, $block_custom->delta); + linkchecker_watchdog_log('linkchecker', 'Changed permanently moved link in custom block %bid from %src to %dst.', array('%bid' => $block_custom->delta, '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO); + } + else { + linkchecker_watchdog_log('linkchecker', 'Link update in block failed. Permanently moved link %src not found in block %bid. Manual fix required.', array('%bid' => $block_custom->delta, '%src' => $link->url), WATCHDOG_WARNING); + } + } + else { + linkchecker_watchdog_log('linkchecker', 'Loading block %bid for update failed. Manual fix required.', array('%bid' => $block_custom->delta), WATCHDOG_ERROR); + } + } + + // Revert user back to anonymous. + linkchecker_revert_user(); + } + else { + linkchecker_watchdog_log('linkchecker', 'Link %link has changed and needs to be updated.', array('%link' => $link->url), WATCHDOG_NOTICE, l(t('Broken links'), 'admin/reports/linkchecker')); + } + break; + + case 404: + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'code' => $response->code, + 'error' => $response->error, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->expression('fail_count', 'fail_count + 1') + ->execute(); + linkchecker_watchdog_log('linkchecker', 'Broken link %link has been found.', array('%link' => $link->url), WATCHDOG_NOTICE, l(t('Broken links'), 'admin/reports/linkchecker')); + + // If unpublishing limit is reached, unpublish all nodes having this link. + $linkchecker_action_status_code_404 = variable_get('linkchecker_action_status_code_404', 0); + if ($linkchecker_action_status_code_404 && $linkchecker_action_status_code_404 <= ($link->fail_count + 1)) { + // Switch anonymous user to an admin. + linkchecker_impersonate_user(user_load_by_name(variable_get('linkchecker_impersonate_user', ''))); + _linkchecker_unpublish_nodes($link->lid); + linkchecker_revert_user(); + } + break; + + case 405: + // - 405: Special error handling if method is not allowed. Switch link + // checking to GET method and try again. + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'method' => 'GET', + 'code' => $response->code, + 'error' => $response->error, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->expression('fail_count', 'fail_count + 1') + ->execute(); + + linkchecker_watchdog_log('linkchecker', 'Method HEAD is not allowed for link %link. Method has been changed to GET.', array('%link' => $link->url), WATCHDOG_INFO, l(t('Broken links'), 'admin/reports/linkchecker')); + break; + + case 500: + // - 500: Like WGET, try with GET on "500 Internal server error". + // - If GET also fails with status code 500, than the link is broken. + if ($link->method == 'GET' && $response->code == 500) { + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'code' => $response->code, + 'error' => $response->error, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->expression('fail_count', 'fail_count + 1') + ->execute(); + + linkchecker_watchdog_log('linkchecker', 'Broken link %link has been found.', array('%link' => $link->url), WATCHDOG_NOTICE, l(t('Broken links'), 'admin/reports/linkchecker')); + } + else { + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'method' => 'GET', + 'code' => $response->code, + 'error' => $response->error, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->expression('fail_count', 'fail_count + 1') + ->execute(); + + linkchecker_watchdog_log('linkchecker', 'Internal server error for link %link. Method has been changed to GET.', array('%link' => $link->url), WATCHDOG_INFO, l(t('Broken links'), 'admin/reports/linkchecker')); + } + break; + + default: + // Don't treat ignored response codes as errors. + if (in_array($response->code, $ignore_response_codes)) { + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'code' => $response->code, + 'error' => $response->error, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->execute(); + // linkchecker_watchdog_log('linkchecker', 'Unhandled link error %link has been found.', array('%link' => $link->url), WATCHDOG_ERROR, l(t('Broken links'), 'admin/reports/linkchecker')); + } + else { + db_update('linkchecker_link') + ->condition('lid', $link->lid) + ->fields(array( + 'code' => $response->code, + 'error' => $response->error, + 'fail_count' => 0, + 'last_checked' => time(), + )) + ->expression('fail_count', 'fail_count + 1') + ->execute(); + // linkchecker_watchdog_log('linkchecker', 'Unhandled link error %link has been found.', array('%link' => $link->url), WATCHDOG_ERROR, l(t('Broken links'), 'admin/reports/linkchecker')); + } + } + + // Free Memory. + $response = new stdClass(); +} + +/** + * Implements hook_node_type_delete(). + */ +function linkchecker_node_type_delete($info) { + variable_del('linkchecker_scan_node_' . $info->type); + variable_del('linkchecker_scan_comment_' . $info->type); +} + +/** + * Implements hook_node_prepare(). + */ +function linkchecker_node_prepare($node) { + // Node edit tab is viewed. + if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'edit' && isset($node->nid)) { + // Show a message on node edit page if a link check failed once or more. + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + $links = db_query('SELECT ll.* FROM {linkchecker_node} ln INNER JOIN {linkchecker_link} ll ON ln.lid = ll.lid WHERE ln.nid = :nid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':nid' => $node->nid, ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes)); + foreach ($links as $link) { + if (_linkchecker_link_access($link)) { + drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE); + } + } + } +} + +/** + * Implements hook_node_delete(). + */ +function linkchecker_node_delete($node) { + _linkchecker_delete_node_links($node->nid); +} + +/** + * Implements hook_node_insert(). + */ +function linkchecker_node_insert($node) { + // Every moderation module saving a forward revision needs to exit here. + // Please see _linkchecker_isdefaultrevision() for more details. + // @todo: Refactor this workaround under D8. + if (!_linkchecker_isdefaultrevision($node)) { + return; + } + + // The node is going to be published. + if (variable_get('linkchecker_scan_node_' . $node->type, FALSE) && $node->status == NODE_PUBLISHED) { + _linkchecker_add_node_links($node); + } +} + +/** + * Implements hook_node_update(). + */ +function linkchecker_node_update($node) { + // Every moderation module saving a forward revision needs to exit here. + // Please see _linkchecker_isdefaultrevision() for more details. + // @todo: Refactor this workaround under D8. + if (!_linkchecker_isdefaultrevision($node)) { + return; + } + + // The node is going to be published. + if (variable_get('linkchecker_scan_node_' . $node->type, FALSE) && $node->status == NODE_PUBLISHED) { + _linkchecker_add_node_links($node); + } + else { + // The node is going to be unpublished. + linkchecker_node_delete($node); + } +} + +/** + * Implements hook_comment_delete(). + */ +function linkchecker_comment_delete($comment) { + _linkchecker_delete_comment_links($comment->cid); +} + +/** + * Implements hook_comment_insert(). + */ +function linkchecker_comment_insert($comment) { + // The comment is going to be published. + $node_type = db_query('SELECT type FROM {node} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField(); + if (variable_get('linkchecker_scan_comment_' . $node_type, FALSE) && $comment->status == COMMENT_PUBLISHED) { + _linkchecker_add_comment_links($comment); + } +} + +/** + * Implements hook_comment_update(). + */ +function linkchecker_comment_update($comment) { + // The node is going to be published. + $node_type = db_query('SELECT type FROM {node} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField(); + if (variable_get('linkchecker_scan_comment_' . $node_type, FALSE) && $comment->status == COMMENT_PUBLISHED) { + _linkchecker_add_comment_links($comment); + } + else { + // The node is going to be unpublished. + linkchecker_comment_delete($comment); + } +} + +/** + * Implements hook_form_alter(). + */ +function linkchecker_form_alter(&$form, &$form_state, $form_id) { + switch ($form_id) { + // Catch the custom block add/configure form and add custom submit handler. + case 'block_add_block_form': + // Add custom submit handler to custom block add form. + $form['#submit'][] = 'linkchecker_block_custom_add_form_submit'; + break; + + case 'block_admin_configure': + // When displaying the form, show the broken links warning. + if (empty($form_state['input']) && is_numeric(arg(5))) { + // Show a message on custom block edit page if a link check failed once + // or more often. + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + $links = db_query('SELECT ll.* FROM {linkchecker_block_custom} lb INNER JOIN {linkchecker_link} ll ON lb.lid = ll.lid WHERE lb.bid = :bid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':bid' => arg(5), ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes)); + foreach ($links as $link) { + if (_linkchecker_link_access($link)) { + drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE); + } + } + } + + // Add custom submit handler to custom block configuration form. + $form['#submit'][] = 'linkchecker_block_custom_configure_form_submit'; + break; + + case 'block_custom_block_delete': + // Add custom submit handler to custom block delete form. + $form['#submit'][] = 'linkchecker_block_custom_delete_form_submit'; + break; + } +} + +/** + * Implements hook_form_BASE_FORM_ID_alter(). + */ +function linkchecker_form_node_type_form_alter(&$form, $form_state) { + if (isset($form['type'])) { + $form['#submit'][] = 'linkchecker_node_type_form_submit'; + $form['linkchecker'] = array( + '#title' => t('Link checker'), + '#type' => 'fieldset', + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#group' => 'additional_settings', + '#attached' => array( + 'js' => array(drupal_get_path('module', 'linkchecker') . '/linkchecker-node-form.js'), + ), + ); + $form['linkchecker']['linkchecker_scan_node'] = array( + '#type' => 'checkbox', + '#title' => t('Scan content'), + '#description' => t('Enables link checking for this content type.'), + '#default_value' => variable_get('linkchecker_scan_node_' . $form['#node_type']->type, FALSE), + ); + if (module_exists('comment')) { + $form['linkchecker']['linkchecker_scan_comment'] = array( + '#type' => 'checkbox', + '#title' => t('Scan comments'), + '#description' => t('Enables link checking for comments.'), + '#default_value' => variable_get('linkchecker_scan_comment_' . $form['#node_type']->type, FALSE), + ); + } + } +} + +/** + * Submit handler for linkchecker_form_node_type_form_alter(). + */ +function linkchecker_node_type_form_submit($form, $form_state) { + $original_linkchecker_state = $form['linkchecker']['linkchecker_scan_node']['#default_value']; + // Default to TRUE if comment module isn't enabled, we don't care. + $original_linkchecker_comment_state = TRUE; + if (module_exists('comment')) { + $original_linkchecker_comment_state = $form['linkchecker']['linkchecker_scan_comment']['#default_value']; + } + $values = $form_state['values']; + $loaded = FALSE; + $node_type = $form['#node_type']->type; + if (!$original_linkchecker_state && $values['linkchecker_scan_node']) { + // We need to scan this node-type now. + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_nodes(array($node_type))); + $loaded = TRUE; + } + // Use !empty here for when comment module isn't enabled and there is no + // field. + if (!$original_linkchecker_comment_state && !empty($values['linkchecker_scan_comment'])) { + // We need to scan comments for this node-type now. + if (!$loaded) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + } + batch_set(_linkchecker_batch_import_comments(array($node_type))); + } +} + +/** + * Implements hook_form_BASE_FORM_ID_alter(). + */ +function linkchecker_form_comment_form_alter(&$form, &$form_state, $form_id) { + // When displaying the form as 'view' or 'preview', show the broken links + // warning. + if ((empty($form_state['input']) || (isset($form_state['input']['op']) && $form_state['input']['op'] == t('Preview'))) && arg(0) == 'comment' && is_numeric(arg(1)) && arg(2) == 'edit') { + // Show a message on comment edit page if a link check failed once or + // more often. + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + $links = db_query('SELECT ll.* FROM {linkchecker_comment} lc INNER JOIN {linkchecker_link} ll ON lc.lid = ll.lid WHERE lc.cid = :cid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':cid' => arg(1), ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes)); + foreach ($links as $link) { + if (_linkchecker_link_access($link)) { + drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE); + } + } + } +} + +/** + * Custom submit handler for block add page. + */ +function linkchecker_block_custom_add_form_submit($form, &$form_state) { + if (variable_get('linkchecker_scan_blocks', 0)) { + $bid = db_query('SELECT MAX(bid) FROM {block_custom}')->fetchField(); + _linkchecker_add_block_custom_links($form_state['values'], $bid); + } +} + +/** + * Custom submit handler for block configure page. + */ +function linkchecker_block_custom_configure_form_submit($form, &$form_state) { + if (variable_get('linkchecker_scan_blocks', 0)) { + _linkchecker_add_block_custom_links($form_state['values'], $form_state['values']['delta']); + } +} + +/** + * Custom submit handler for block delete page. + */ +function linkchecker_block_custom_delete_form_submit($form, &$form_state) { + _linkchecker_delete_block_custom_links($form_state['values']['bid']); +} + +/** + * Implements hook_views_api(). + */ +function linkchecker_views_api() { + return array( + 'api' => 3, + 'path' => drupal_get_path('module', 'linkchecker') . '/views', + ); +} + +/** + * Returns information from database about a user-created (custom) block. + * + * @param int $bid + * ID of the block to get information for. + * + * @return object + * Associative object of information stored in the database for this block. + * Object keys: + * - module: 'block' as the source of the custom blocks data. + * - delta: Block ID. + * - info: Block description. + * - body['value']: Block contents. + * - body['format']: Filter ID of the filter format for the body. + */ +function linkchecker_block_custom_block_get($bid) { + $block_custom = block_custom_block_get($bid); + + if ($block_custom) { + $block = new stdClass(); + $block->module = 'block'; + $block->delta = $block_custom['bid']; + $block->info = $block_custom['info']; + $block->body = array(); + $block->body['value'] = $block_custom['body']; + $block->body['format'] = $block_custom['format']; + } + else { + $block = FALSE; + } + + return $block; +} + +/** + * Extracts links from a node. + * + * @param object $node + * The fully populated node object. + * @param bool $return_field_names + * If set to TRUE, the returned array will contain the link URLs as keys, and + * each element will be an array containing all field names in which the URL + * is found. Otherwise, a simple array of URLs will be returned. + * + * @return array + * An array whose keys are fully qualified and unique URLs found in the node + * (as returned by _linkchecker_extract_links()), or a more complex + * structured array (see above) if $return_field_names is TRUE. + */ +function _linkchecker_extract_node_links($node, $return_field_names = FALSE) { + + $filter = new stdClass(); + $filter->settings['filter_url_length'] = 72; + + // Create array of node fields to scan. + $text_items = array(); + $text_items_by_field = array(); + + // Add fields typically not used for urls to the bottom. This way a link may + // found earlier while looping over $text_items_by_field below. + $text_items_by_field = array_merge($text_items_by_field, _linkchecker_parse_fields('node', $node->type, $node, TRUE)); + $text_items_by_field['title'][] = _filter_url($node->title, $filter); + $text_items = _linkchecker_array_values_recursive($text_items_by_field); + + // Get the absolute node path for extraction of relative links. + $languages = language_list(); + // Note: An "undefined language" (value: 'und') isn't listed in the available + // languages variable $languages. + $url_options = (empty($node->language) || empty($languages[$node->language])) ? array('absolute' => TRUE) : array('language' => $languages[$node->language], 'absolute' => TRUE); + $path = url('node/' . $node->nid, $url_options); + + // Extract all links in a node. + $links = _linkchecker_extract_links(implode(' ', $text_items), $path); + + // Return either the array of links, or an array of field names containing + // each link, depending on what was requested. + if (!$return_field_names) { + return $links; + } + else { + $field_names = array(); + foreach ($text_items_by_field as $field_name => $items) { + foreach ($items as $item) { + foreach ($links as $uri => $link) { + // We only need to do a quick check here to see if the URL appears + // anywhere in the text; if so, that means users with access to this + // field will be able to see the URL (and any private data such as + // passwords contained in it). This is sufficient for the purposes of + // _linkchecker_link_node_ids(), where this information is used. + foreach ($link as $original_link) { + if (strpos($item, $original_link) !== FALSE) { + $field_names[$uri][$field_name] = $field_name; + } + // URLs in $links have been auto-decoded by DOMDocument->loadHTML + // and does not provide the RAW url with html special chars. + // NOTE: htmlspecialchars() is 30% slower than str_replace(). + elseif (strpos($item, str_replace('&', '&', $original_link)) !== FALSE) { + $field_names[$uri][$field_name] = $field_name; + } + } + } + } + } + + return $field_names; + } +} + +/** + * Add node links to database. + * + * @param object $node + * The fully populated node object. + * @param bool $skip_missing_links_detection + * To prevent endless batch loops the value need to be TRUE. With FALSE + * the need for content re-scans is detected by the number of missing links. + */ +function _linkchecker_add_node_links($node, $skip_missing_links_detection = FALSE) { + $links = array_keys(_linkchecker_extract_node_links($node)); + + // Node have links. + if (!empty($links)) { + // Remove all links from the links array already in the database and only + // add missing links to database. + $missing_links = _linkchecker_node_links_missing($node->nid, $links); + + // Only add links to database that do not exists. + $i = 0; + foreach ($missing_links as $url) { + $urlhash = drupal_hash_base64($url); + $link = db_query('SELECT lid FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => $urlhash))->fetchObject(); + if (!$link) { + $link = new stdClass(); + $link->urlhash = $urlhash; + $link->url = $url; + $link->status = _linkchecker_link_check_status_filter($url); + drupal_write_record('linkchecker_link', $link); + } + db_insert('linkchecker_node') + ->fields(array( + 'nid' => $node->nid, + 'lid' => $link->lid, + )) + ->execute(); + + // Break processing if max links limit per run has been reached. + $i++; + if ($i >= LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) { + break; + } + } + + // The first chunk of links not yet found in the {linkchecker_link} table + // have now been imported by the above code. If the number of missing links + // still exceeds the scan limit defined in LINKCHECKER_SCAN_MAX_LINKS_PER_RUN + // the content need to be re-scanned until all links have been collected and + // saved in {linkchecker_link} table. + // + // Above code has already scanned a number of LINKCHECKER_SCAN_MAX_LINKS_PER_RUN + // links and need to be substracted from the number of missing links to + // calculate the correct number of re-scan rounds. + // + // To prevent endless loops the $skip_missing_links_detection need to be TRUE. + // This value will be set by the calling batch process that already knows + // that it is running a batch job and the number of required re-scan rounds. + $missing_links_count = count($missing_links) - LINKCHECKER_SCAN_MAX_LINKS_PER_RUN; + if (!$skip_missing_links_detection && $missing_links_count > 0) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_single_node($node->nid, $missing_links_count)); + + // If batches were set in the submit handlers, we process them now, + // possibly ending execution. We make sure we do not react to the batch + // that is already being processed (if a batch operation performs a + // drupal_execute). + if ($batch = &batch_get() && !isset($batch['current_set'])) { + batch_process('node/' . $node->nid); + } + } + } + + // Remove dead link references for cleanup reasons as very last step. + _linkchecker_cleanup_node_references($node->nid, $links); +} + +/** + * Add comment links to database. + * + * @param object $comment + * The fully populated comment object. + * @param bool $skip_missing_links_detection + * To prevent endless batch loops the value need to be TRUE. With FALSE + * the need for content re-scans is detected by the number of missing links. + */ +function _linkchecker_add_comment_links($comment, $skip_missing_links_detection = FALSE) { + + $filter = new stdClass(); + $filter->settings['filter_url_length'] = 72; + + // Create array of comment fields to scan. + $text_items = array(); + $text_items[] = _filter_url($comment->subject, $filter); + $text_items = array_merge($text_items, _linkchecker_parse_fields('comment', $comment->node_type, $comment)); + + // Get the absolute node path for extraction of relative links. + $languages = language_list(); + $node = node_load($comment->nid); + $url_options = (empty($node->language) || empty($languages[$node->language])) ? array('absolute' => TRUE) : array('language' => $languages[$node->language], 'absolute' => TRUE); + $path = url('node/' . $comment->nid, $url_options); + + // Extract all links in a comment. + $links = array_keys(_linkchecker_extract_links(implode(' ', $text_items), $path)); + + // Comment have links. + if (!empty($links)) { + // Remove all links from the links array already in the database and only + // add missing links to database. + $missing_links = _linkchecker_comment_links_missing($comment->cid, $links); + + // Only add unique links to database that do not exist. + $i = 0; + foreach ($missing_links as $url) { + $urlhash = drupal_hash_base64($url); + $link = db_query('SELECT lid FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => $urlhash))->fetchObject(); + if (!$link) { + $link = new stdClass(); + $link->urlhash = $urlhash; + $link->url = $url; + $link->status = _linkchecker_link_check_status_filter($url); + drupal_write_record('linkchecker_link', $link); + } + db_insert('linkchecker_comment') + ->fields(array( + 'cid' => $comment->cid, + 'lid' => $link->lid, + )) + ->execute(); + + // Break processing if max links limit per run has been reached. + $i++; + if ($i >= LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) { + break; + } + } + + // The first chunk of links not yet found in the {linkchecker_link} table + // have now been imported by the above code. If the number of missing links + // still exceeds the scan limit defined in LINKCHECKER_SCAN_MAX_LINKS_PER_RUN + // the content need to be re-scanned until all links have been collected and + // saved in {linkchecker_link} table. + // + // Above code has already scanned a number of LINKCHECKER_SCAN_MAX_LINKS_PER_RUN + // links and need to be substracted from the number of missing links to + // calculate the correct number of re-scan rounds. + // + // To prevent endless loops the $skip_missing_links_detection need to be TRUE. + // This value will be set by the calling batch process that already knows + // that it is running a batch job and the number of required re-scan rounds. + $missing_links_count = count($missing_links) - LINKCHECKER_SCAN_MAX_LINKS_PER_RUN; + if (!$skip_missing_links_detection && $missing_links_count > 0) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_single_comment($comment->cid, $missing_links_count)); + + // If batches were set in the submit handlers, we process them now, + // possibly ending execution. We make sure we do not react to the batch + // that is already being processed (if a batch operation performs a + // drupal_execute). + if ($batch = &batch_get() && !isset($batch['current_set'])) { + batch_process('node/' . $comment->nid); + } + } + } + + // Remove dead link references for cleanup reasons as very last step. + _linkchecker_cleanup_comment_references($comment->cid, $links); +} + +/** + * Add custom block links to database. + * + * @param array|object $block_custom + * The fully populated custom block object. + * @param int $bid + * Block id from table {block}.bid. + * @param bool $skip_missing_links_detection + * To prevent endless batch loops the value need to be TRUE. With FALSE + * the need for content re-scans is detected by the number of missing links. + */ +function _linkchecker_add_block_custom_links($block_custom, $bid, $skip_missing_links_detection = FALSE) { + // Convert custom block array to object. + // @todo: Are we able to remove this global conversion? + $block_custom = (object) $block_custom; + + // Custom blocks really suxxx as it's very inconsistent core logic (values are + // integers or strings) and there are no usable hooks. Try to workaround this + // bad logic as good as possible to prevent warnings/errors. + // NOTE: Only custom blocks from block.module are supported. Skip all others. + if ($block_custom->module != 'block' || !is_numeric($block_custom->delta) || !is_numeric($bid) || $block_custom->delta != $bid) { + return; + } + + $filter = new stdClass(); + $filter->settings['filter_url_length'] = 72; + + // Create array of custom block fields to scan. All fields cannot exists. + $text_items = array(); + if (!empty($block_custom->info)) { + $text_items[] = _filter_url($block_custom->info, $filter); + } + // $block_custom from editing/scanning a block. See block_custom_block_save(). + if (!empty($block_custom->body) && is_array($block_custom->body) && array_key_exists('value', $block_custom->body) && array_key_exists('format', $block_custom->body)) { + $text_items[] = _linkchecker_check_markup($block_custom->body['value'], $block_custom->body['format']); + } + + // Extract all links in a custom block. + $links = array_keys(_linkchecker_extract_links(implode(' ', $text_items))); + + // Custom block has links. + if (!empty($links)) { + // Remove all links from the links array already in the database and only + // add missing links to database. + $missing_links = _linkchecker_block_custom_links_missing($bid, $links); + + // Only add unique links to database that do not exist. + $i = 0; + foreach ($missing_links as $url) { + $urlhash = drupal_hash_base64($url); + $link = db_query('SELECT lid FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => $urlhash))->fetchObject(); + if (!$link) { + $link = new stdClass(); + $link->urlhash = $urlhash; + $link->url = $url; + $link->status = _linkchecker_link_check_status_filter($url); + drupal_write_record('linkchecker_link', $link); + } + db_insert('linkchecker_block_custom') + ->fields(array( + 'bid' => $bid, + 'lid' => $link->lid, + )) + ->execute(); + + // Break processing if max links limit per run has been reached. + $i++; + if ($i >= LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) { + break; + } + } + + // The first chunk of links not yet found in the {linkchecker_link} table + // have now been imported by the above code. If the number of missing links + // still exceeds the scan limit defined in LINKCHECKER_SCAN_MAX_LINKS_PER_RUN + // the content need to be re-scanned until all links have been collected and + // saved in {linkchecker_link} table. + // + // Above code has already scanned a number of LINKCHECKER_SCAN_MAX_LINKS_PER_RUN + // links and need to be substracted from the number of missing links to + // calculate the correct number of re-scan rounds. + // + // To prevent endless loops the $skip_missing_links_detection need to be TRUE. + // This value will be set by the calling batch process that already knows + // that it is running a batch job and the number of required re-scan rounds. + $missing_links_count = count($missing_links) - LINKCHECKER_SCAN_MAX_LINKS_PER_RUN; + if (!$skip_missing_links_detection && $missing_links_count > 0) { + module_load_include('inc', 'linkchecker', 'linkchecker.batch'); + batch_set(_linkchecker_batch_import_single_block_custom($bid, $missing_links_count)); + + // If batches were set in the submit handlers, we process them now, + // possibly ending execution. We make sure we do not react to the batch + // that is already being processed (if a batch operation performs a + // drupal_execute). + if ($batch = &batch_get() && !isset($batch['current_set'])) { + batch_process('admin/structure/block'); + } + } + } + + // Remove dead link references for cleanup reasons as very last step. + _linkchecker_cleanup_block_custom_references($bid, $links); +} + +/** + * Remove all node references to links in the linkchecker_node table. + * + * @param int $nid + * The node ID. + */ +function _linkchecker_delete_node_links($nid) { + db_delete('linkchecker_node') + ->condition('nid', $nid) + ->execute(); +} + +/** + * Remove all comment references to links in the linkchecker_comment table. + * + * @param int $cid + * The comment ID. + */ +function _linkchecker_delete_comment_links($cid) { + db_delete('linkchecker_comment') + ->condition('cid', $cid) + ->execute(); +} + +/** + * Remove all block references to links in the linkchecker_block_custom table. + * + * @param int $bid + * The block ID. + * + */ +function _linkchecker_delete_block_custom_links($bid) { + db_delete('linkchecker_block_custom') + ->condition('bid', $bid) + ->execute(); +} + +/** + * Cleanup no longer used node references to links in the linkchecker_node table. + * + * @param int $nid + * The node ID. + * @param array $links + */ +function _linkchecker_cleanup_node_references($nid = 0, $links = array()) { + if (empty($links)) { + // Node do not have links. Delete all references if exists. + db_delete('linkchecker_node') + ->condition('nid', $nid) + ->execute(); + } + else { + // The node still have more than one link, but other links may have been + // removed and links no longer in the content need to be deleted from the + // linkchecker_node reference table. + $subquery = db_select('linkchecker_link') + ->fields('linkchecker_link', array('lid')) + ->condition('urlhash', array_map('drupal_hash_base64', $links), 'IN'); + + db_delete('linkchecker_node') + ->condition('nid', $nid) + ->condition('lid', $subquery, 'NOT IN') + ->execute(); + } +} + +/** + * Cleanup no longer used comment references to links in the linkchecker_comment table. + * + * @param int $cid + * The comment ID. + * @param array $links + */ +function _linkchecker_cleanup_comment_references($cid = 0, $links = array()) { + if (empty($links)) { + // Comment do not have links. Delete all references if exists. + db_delete('linkchecker_comment') + ->condition('cid', $cid) + ->execute(); + } + else { + // The comment still have more than one link, but other links may have been + // removed and links no longer in the content need to be deleted from the + // linkchecker_comment reference table. + $subquery = db_select('linkchecker_link', 'll') + ->fields('ll', array('lid')) + ->condition('ll.urlhash', array_map('drupal_hash_base64', $links), 'IN'); + + db_delete('linkchecker_comment') + ->condition('cid', $cid) + ->condition('lid', $subquery, 'NOT IN') + ->execute(); + } +} + +/** + * Cleanup no longer used custom block references to links in the linkchecker_block_custom table. + * + * @param int $bid + * The block ID. + * @param array $links + */ +function _linkchecker_cleanup_block_custom_references($bid = 0, $links = array()) { + if (empty($links)) { + // Block do not have links. Delete all references if exists. + db_delete('linkchecker_block_custom') + ->condition('bid', $bid) + ->execute(); + } + else { + // The block still have more than one link, but other links may have been + // removed and links no longer in the content need to be deleted from the + // linkchecker_block_custom reference table. + $subquery = db_select('linkchecker_link') + ->fields('linkchecker_link', array('lid')) + ->condition('urlhash', array_map('drupal_hash_base64', $links), 'IN'); + + db_delete('linkchecker_block_custom') + ->condition('bid', $bid) + ->condition('lid', $subquery, 'NOT IN') + ->execute(); + } +} + +/** + * Returns an array of node references missing in the linkchecker_node table. + * + * @param int $nid + * The node ID. + * @param array $links + * An array of links. + * + * @return array + * An array of node references missing in the linkchecker_node table. + */ +function _linkchecker_node_links_missing($nid, $links) { + $result = db_query('SELECT ll.url FROM {linkchecker_link} ll INNER JOIN {linkchecker_node} ln ON ln.lid = ll.lid WHERE ln.nid = :nid AND ll.urlhash IN (:urlhashes)', array(':nid' => $nid, ':urlhashes' => array_map('drupal_hash_base64', $links))); + $links_in_database = array(); + foreach ($result as $row) { + $links_in_database[] = $row->url; + } + return array_diff($links, $links_in_database); +} + +/** + * Returns an array of comment references missing in the linkchecker_comment table. + * + * @param int $cid + * The comment ID. + * @param array $links + * An array of links. + * + * @return array + * An array of comment references missing in the linkchecker_comment table. + */ +function _linkchecker_comment_links_missing($cid, $links) { + $result = db_query('SELECT ll.url FROM {linkchecker_link} ll INNER JOIN {linkchecker_comment} lc ON lc.lid = ll.lid WHERE lc.cid = :cid AND ll.urlhash IN (:urlhashes)', array(':cid' => $cid, ':urlhashes' => array_map('drupal_hash_base64', $links))); + $links_in_database = array(); + foreach ($result as $row) { + $links_in_database[] = $row->url; + } + return array_diff($links, $links_in_database); +} + +/** + * Returns an array of custom block references missing in the linkchecker_block_custom table. + * + * @param int $bid + * The block ID. + * @param array $links + * An array of links. + * + * @return array + * An array of custom block references missing in the linkchecker_block_custom + * table. + */ +function _linkchecker_block_custom_links_missing($bid, $links) { + $result = db_query('SELECT ll.url FROM {linkchecker_link} ll INNER JOIN {linkchecker_block_custom} lb ON lb.lid = ll.lid WHERE lb.bid = :bid AND ll.urlhash IN (:urlhashes)', array(':bid' => $bid, ':urlhashes' => array_map('drupal_hash_base64', $links))); + $links_in_database = array(); + foreach ($result as $row) { + $links_in_database[] = $row->url; + } + return array_diff($links, $links_in_database); +} + +/** + * Parse the urls from entity. + * + * This function parse all fields from the entity and returns an array of + * filtered field items. + * + * @param string $entity_type + * The type of entity; e.g., 'node', 'comment'. + * @param string $bundle_name + * The name of the bundle aka node type, e.g., 'article', 'page'. + * @param object $entity + * The entity to parse, a $node or a $comment object. + * @param bool $return_field_names + * If set to TRUE, the returned array will contain the content as keys, and + * each element will be an array containing all field names in which the + * content is found. Otherwise, a simple array with content will be returned. + * + * @return array + * Array of field items with filters applied. + */ +function _linkchecker_parse_fields($entity_type, $bundle_name, $entity, $return_field_names = FALSE) { + $text_items = array(); + $text_items_by_field = array(); + + // Create settings for _filter_url() function. + $filter = new stdClass(); + $filter->settings['filter_url_length'] = 72; + + // Collect the fields from this entity_type and bundle. + foreach (field_info_instances($entity_type, $bundle_name) as $field_name => $instance) { + $field = field_info_field($field_name); + // #1923328: field_name array may be missing in $entity. + $entity_field = isset($entity->{$field['field_name']}) ? $entity->{$field['field_name']} : array(); + + switch ($field['type']) { + // Core fields. + case 'text_with_summary': + foreach ($entity_field as $language) { + foreach ($language as $item) { + $item += array( + 'format' => NULL, + 'summary' => '', + 'value' => '', + ); + $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['value'], $item['format'], linkchecker_entity_language($entity_type, $entity), TRUE); + $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['summary'], $item['format'], linkchecker_entity_language($entity_type, $entity), TRUE); + } + } + break; + + // Core fields. + case 'text_long': + case 'text': + foreach ($entity_field as $language) { + foreach ($language as $item) { + $item += array( + 'format' => NULL, + 'value' => '', + ); + $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['value'], $item['format'], linkchecker_entity_language($entity_type, $entity), TRUE); + } + } + break; + + // Link module field, http://drupal.org/project/link. + case 'link_field': + foreach ($entity_field as $language) { + foreach ($language as $item) { + $item += array( + 'title' => '', + ); + $options = drupal_parse_url(link_cleanup_url($item['url'])); + $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $options['path'], $options); + $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); + } + } + break; + + // File module field. + case 'file': + foreach ($entity_field as $language) { + foreach ($language as $item) { + $item += array( + 'title' => '', + ); + if (isset($item['uri'])) { + $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $item['uri']); + $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); + } + elseif (isset($item['filefield_dkan_remotefile']['url'])) { + $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $item['filefield_dkan_remotefile']['url']); + $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); + } + } + } + break; + + } + } + + return ($return_field_names) ? $text_items_by_field : $text_items; +} + +/** + * Replace the old url by a new url on 301 status codes. + * + * @param string $entity_type + * The type of entity; e.g., 'node', 'comment'. + * @param string $bundle_name + * The name of the bundle aka node type, e.g., 'article', 'page'. + * @param object $entity + * The entity to parse, a $node or a $comment object. + * @param string $old_url + * The previous url. + * @param string $new_url + * The new url to replace the old. + * + * @return object + */ +function _linkchecker_replace_fields($entity_type, $bundle_name, $entity, $old_url, $new_url) { + // Collect the fields from this entity_type and bundle. + foreach (field_info_instances($entity_type, $bundle_name) as $field_name => $instance) { + $field = field_info_field($field_name); + $entity_field =& $entity->{$field['field_name']}; + + switch ($field['type']) { + // Core fields. + case 'text_with_summary': + foreach ($entity_field as $language_name => $language_value) { + foreach ($language_value as $item_name => $item_value) { + _linkchecker_link_replace($entity_field[$language_name][$item_name]['value'], $old_url, $new_url); + _linkchecker_link_replace($entity_field[$language_name][$item_name]['summary'], $old_url, $new_url); + } + } + break; + + // Core fields. + case 'text_long': + case 'text': + foreach ($entity_field as $language_name => $language_value) { + foreach ($language_value as $item_name => $item_value) { + _linkchecker_link_replace($entity_field[$language_name][$item_name]['value'], $old_url, $new_url); + } + } + break; + + // Link module field, http://drupal.org/project/link. + case 'link_field': + foreach ($entity_field as $language_name => $language_value) { + foreach ($language_value as $item_name => $item_value) { + _linkchecker_link_replace($entity_field[$language_name][$item_name]['url'], $old_url, $new_url); + _linkchecker_link_replace($entity_field[$language_name][$item_name]['title'], $old_url, $new_url); + } + } + break; + } + } + + return $entity; +} + +/** + * Run perodically via cron and delete all links without a references. + * + * For speed reasons and check results we keep the links for some time + * as they may be reused by other new content. + */ +function _linkchecker_cleanup_links() { + // Remove disabled node types no longer in use. + $node_types = linkchecker_scan_node_types(); + if (!empty($node_types)) { + $subquery1 = db_select('node', 'n') + ->fields('n', array('nid')) + ->condition('n.type', $node_types, 'NOT IN'); + + db_delete('linkchecker_node') + ->condition('nid', $subquery1, 'IN') + ->execute(); + + // @todo Remove comments link references from table. + // db_query('DELETE FROM {linkchecker_comment} WHERE cid IN (SELECT nid FROM {node} n WHERE n.type NOT IN (' . db_placeholders($node_types, 'varchar') . '))', $node_types); + } + else { + // No active node_type. Remove all items from table. + db_truncate('linkchecker_node')->execute(); + // @todo Remove comments link references from table. + } + + // Remove comment link references if comment scanning is disabled. + // @todo Remove comments of unpublished nodes. + $comment_types = linkchecker_scan_comment_types(); + if (empty($comment_types)) { + db_truncate('linkchecker_comment')->execute(); + } + + // Remove block link references if block scanning is disabled. + if (variable_get('linkchecker_scan_blocks', 0) == 0) { + db_truncate('linkchecker_block_custom')->execute(); + } + + // Remove dead links without references. + $linkchecker_node = db_select('linkchecker_node', 'ln') + ->distinct() + ->fields('ln', array('lid')); + $linkchecker_comment = db_select('linkchecker_comment', 'lc') + ->distinct() + ->fields('lc', array('lid')); + $linkchecker_block_custom = db_select('linkchecker_block_custom', 'lb') + ->distinct() + ->fields('lb', array('lid')); + + // UNION all linkchecker type tables. + $subquery2 = db_select($linkchecker_block_custom->union($linkchecker_comment)->union($linkchecker_node), 'q1') + ->distinct() + ->fields('q1', array('lid')); + + db_delete('linkchecker_link') + ->condition('lid', $subquery2, 'NOT IN') + ->execute(); + +} + +/** + * Extract links from content. + * + * @param string $text + * The text to be scanned for links. + * @param string $content_path + * Path to the content that is currently scanned for links. This value is + * required to build full qualified links from relative links. Relative links + * are not extracted from content, if path is not provided. + * + * @return array + * Array whose keys are fully qualified and unique URLs found in the + * content, and whose values are arrays of actual text (raw URLs or paths) + * corresponding to each fully qualified URL. + */ +function _linkchecker_extract_links($text = '', $content_path = NULL) { + global $base_root, $is_https; + + $html_dom = filter_dom_load($text); + $urls = array(); + + // Finds all hyperlinks in the content. + if (variable_get('linkchecker_extract_from_a', 1) == 1) { + $links = $html_dom->getElementsByTagName('a'); + foreach ($links as $link) { + $urls[] = $link->getAttribute('href'); + } + + $links = $html_dom->getElementsByTagName('area'); + foreach ($links as $link) { + $urls[] = $link->getAttribute('href'); + } + } + + // Finds all audio links in the content. + if (variable_get('linkchecker_extract_from_audio', 0) == 1) { + $audios = $html_dom->getElementsByTagName('audio'); + foreach ($audios as $audio) { + $urls[] = $audio->getAttribute('src'); + + // Finds source tags with links in the audio tag. + $sources = $audio->getElementsByTagName('source'); + foreach ($sources as $source) { + $urls[] = $source->getAttribute('src'); + } + // Finds track tags with links in the audio tag. + $tracks = $audio->getElementsByTagName('track'); + foreach ($tracks as $track) { + $urls[] = $track->getAttribute('src'); + } + } + } + + // Finds embed tags with links in the content. + if (variable_get('linkchecker_extract_from_embed', 0) == 1) { + $embeds = $html_dom->getElementsByTagName('embed'); + foreach ($embeds as $embed) { + $urls[] = $embed->getAttribute('src'); + $urls[] = $embed->getAttribute('pluginurl'); + $urls[] = $embed->getAttribute('pluginspage'); + } + } + + // Finds iframe tags with links in the content. + if (variable_get('linkchecker_extract_from_iframe', 0) == 1) { + $iframes = $html_dom->getElementsByTagName('iframe'); + foreach ($iframes as $iframe) { + $urls[] = $iframe->getAttribute('src'); + } + } + + // Finds img tags with links in the content. + if (variable_get('linkchecker_extract_from_img', 0) == 1) { + $imgs = $html_dom->getElementsByTagName('img'); + foreach ($imgs as $img) { + $urls[] = $img->getAttribute('src'); + $urls[] = $img->getAttribute('longdesc'); + } + } + + // Finds object/param tags with links in the content. + if (variable_get('linkchecker_extract_from_object', 0) == 1) { + $objects = $html_dom->getElementsByTagName('object'); + foreach ($objects as $object) { + $urls[] = $object->getAttribute('data'); + $urls[] = $object->getAttribute('codebase'); + + // Finds param tags with links in the object tag. + $params = $object->getElementsByTagName('param'); + foreach ($params as $param) { + // @todo + // - Try to extract links in unkown "flashvars" values + // (e.g., file=http://, data=http://). + $names = array('archive', 'filename', 'href', 'movie', 'src', 'url'); + if ($param->hasAttribute('name') && in_array($param->getAttribute('name'), $names)) { + $urls[] = $param->getAttribute('value'); + } + + $srcs = array('movie'); + if ($param->hasAttribute('src') && in_array($param->getAttribute('src'), $srcs)) { + $urls[] = $param->getAttribute('value'); + } + } + } + } + + // Finds video tags with links in the content. + if (variable_get('linkchecker_extract_from_video', 0) == 1) { + $videos = $html_dom->getElementsByTagName('video'); + foreach ($videos as $video) { + $urls[] = $video->getAttribute('poster'); + $urls[] = $video->getAttribute('src'); + + // Finds source tags with links in the video tag. + $sources = $video->getElementsByTagName('source'); + foreach ($sources as $source) { + $urls[] = $source->getAttribute('src'); + } + // Finds track tags with links in the audio tag. + $tracks = $video->getElementsByTagName('track'); + foreach ($tracks as $track) { + $urls[] = $track->getAttribute('src'); + } + } + } + + // Remove empty values. + $urls = array_filter($urls); + // Remove duplicate urls. + $urls = array_unique($urls); + + // What type of links should be checked? + $linkchecker_check_links_types = variable_get('linkchecker_check_links_types', 1); + + $links = array(); + foreach ($urls as $url) { + // Decode HTML links into plain text links. + // DOMDocument->loadHTML does not provide the RAW url from code. All html + // entities are already decoded. + // @todo: Try to find a way to get the raw value. + $url_decoded = $url; + + // Prefix protocol relative urls with a protocol to allow link checking. + if (preg_match('!^//!', $url_decoded)) { + $http_protocol = $is_https ? 'https' : 'http'; + $url_decoded = $http_protocol . ':' . $url_decoded; + } + + // FIXME: #1149596 HACK - Encode spaces in URLs, so validation equals TRUE and link gets added. + $url_encoded = str_replace(' ', '%20', $url_decoded); + + // Full qualified URLs. + if ($linkchecker_check_links_types != 2 && valid_url($url_encoded, TRUE)) { + // Add to Array and change HTML links into plain text links. + $links[$url_decoded][] = $url; + } + // Skip mailto:, javascript:, etc. + elseif (preg_match('/^\w[\w.+]*:/', $url_decoded)) { + continue; + } + // Local URLs. $linkchecker_check_links_types = 0 or 2 + elseif ($linkchecker_check_links_types != 1 && valid_url($url_encoded, FALSE)) { + // Get full qualified url with base path of content. + $absolute_content_path = _linkchecker_absolute_content_path($content_path); + + // Absolute local URLs need to start with [/]. + if (preg_match('!^/!', $url_decoded)) { + // Add to Array and change HTML encoded links into plain text links. + $links[$base_root . $url_decoded][] = $url; + } + // Anchors and URL parameters like "#foo" and "?foo=bar". + elseif (!empty($content_path) && preg_match('!^[?#]!', $url_decoded)) { + // Add to Array and change HTML encoded links into plain text links. + $links[$content_path . $url_decoded][] = $url; + } + // Relative URLs like "./foo/bar" and "../foo/bar". + elseif (!empty($absolute_content_path) && preg_match('!^\.{1,2}/!', $url_decoded)) { + // Build the URI without hostname before the URI is normalized and + // dot-segments will be removed. The hostname is added back after the + // normalization has completed to prevent hostname removal by the regex. + // This logic intentionally does not implement all the rules definied in + // RFC 3986, section 5.2.4 to show broken links and over-dot-segmented + // URIs; e.g., http://example.com/../../foo/bar. + // For more information, see http://drupal.org/node/832388. + $path = substr_replace($absolute_content_path . $url_decoded, '', 0, strlen($base_root)); + + // Remove './' segments where possible. + $path = str_replace('/./', '/', $path); + + // Remove '../' segments where possible. Loop until all segments are + // removed. Taken over from _drupal_build_css_path() in common.inc. + $last = ''; + while ($path != $last) { + $last = $path; + $path = preg_replace('`(^|/)(?!\.\./)([^/]+)/\.\./`', '$1', $path); + } + + // Glue the hostname and path to full-qualified URI. + $links[$base_root . $path][] = $url; + } + // Relative URLs like "test.png". + elseif (!empty($absolute_content_path) && preg_match('!^[^/]!', $url_decoded)) { + $links[$absolute_content_path . $url_decoded][] = $url; + } + else { + // @todo Are there more special cases the module need to handle? + } + } + } + + return $links; +} + +/** + * Replaces old link with new link in text. + * + * @param string $text + * The text a link is inside. Passed in as a reference. + * @param string $old_link_fqdn + * The old link to search for in strings. + * @param string $new_link_fqdn + * The old link should be overwritten with this new link. + */ +function _linkchecker_link_replace(&$text, $old_link_fqdn = '', $new_link_fqdn = '') { + // Don't do any string replacement if one of the values is empty. + if (!empty($text) && !empty($old_link_fqdn) && !empty($new_link_fqdn)) { + // Remove protocols and hostname from local URLs. + $base_roots = array( + drupal_strtolower('http://' . $_SERVER['HTTP_HOST']), + drupal_strtolower('https://' . $_SERVER['HTTP_HOST']), + ); + $old_link = str_replace($base_roots, '', $old_link_fqdn); + $new_link = str_replace($base_roots, '', $new_link_fqdn); + + // Build variables with all URLs and run check_url() only once. + $old_html_link_fqdn = check_url($old_link_fqdn); + $new_html_link_fqdn = check_url($new_link_fqdn); + $old_html_link = check_url($old_link); + $new_html_link = check_url($new_link); + + // Replace links in link fields and text and Links weblink fields. + if (in_array($text, array($old_html_link_fqdn, $old_html_link, $old_link_fqdn, $old_link))) { + // Keep old and new links in the same encoding and format and short or + // fully qualified. + $text = str_replace($old_html_link_fqdn, $new_html_link_fqdn, $text); + $text = str_replace($old_html_link, $new_html_link, $text); + $text = str_replace($old_link_fqdn, $new_link_fqdn, $text); + $text = str_replace($old_link, $new_link, $text); + } + else { + // Create an array of links with HTML decoded and encoded URLs. + $old_links = array( + $old_html_link_fqdn, + $old_html_link, + $old_link, + ); + + // Remove duplicate URLs from array if URLs do not have URL parameters. + // If more than one URL parameter exists - one URL in the array will have + // an unencoded ampersand "&" and a second URL will have an HTML encoded + // ampersand "&". + $old_links = array_unique($old_links); + + // Load HTML code into DOM. + $html_dom = filter_dom_load($text); + + // Finds all hyperlinks in the content. + if (variable_get('linkchecker_extract_from_a', 1) == 1) { + $links = $html_dom->getElementsByTagName('a'); + foreach ($links as $link) { + if (in_array($link->getAttribute('href'), $old_links)) { + $link->setAttribute('href', $new_html_link); + } + // Replace link text, if same like the URL. If a link text contains + // other child tags like <img> it will be skipped. + if (in_array($link->nodeValue, $old_links)) { + $link->nodeValue = $new_html_link; + } + } + + $links = $html_dom->getElementsByTagName('area'); + foreach ($links as $link) { + if (in_array($link->getAttribute('href'), $old_links)) { + $link->setAttribute('href', $new_html_link); + } + } + } + + // Finds all audio links in the content. + if (variable_get('linkchecker_extract_from_audio', 0) == 1) { + $audios = $html_dom->getElementsByTagName('audio'); + foreach ($audios as $audio) { + if (in_array($audio->getAttribute('src'), $old_links)) { + $audio->setAttribute('src', $new_html_link); + } + + // Finds source tags with links in the audio tag. + $sources = $audio->getElementsByTagName('source'); + foreach ($sources as $source) { + if (in_array($source->getAttribute('src'), $old_links)) { + $source->setAttribute('src', $new_html_link); + } + } + // Finds track tags with links in the audio tag. + $tracks = $audio->getElementsByTagName('track'); + foreach ($tracks as $track) { + if (in_array($track->getAttribute('src'), $old_links)) { + $track->setAttribute('src', $new_html_link); + } + } + } + } + + // Finds embed tags with links in the content. + if (variable_get('linkchecker_extract_from_embed', 0) == 1) { + $embeds = $html_dom->getElementsByTagName('embed'); + foreach ($embeds as $embed) { + if (in_array($embed->getAttribute('src'), $old_links)) { + $embed->setAttribute('src', $new_html_link); + } + if (in_array($embed->getAttribute('pluginurl'), $old_links)) { + $embed->setAttribute('pluginurl', $new_html_link); + } + if (in_array($embed->getAttribute('pluginspage'), $old_links)) { + $embed->setAttribute('pluginspage', $new_html_link); + } + } + } + + // Finds iframe tags with links in the content. + if (variable_get('linkchecker_extract_from_iframe', 0) == 1) { + $iframes = $html_dom->getElementsByTagName('iframe'); + foreach ($iframes as $iframe) { + if (in_array($iframe->getAttribute('src'), $old_links)) { + $iframe->setAttribute('src', $new_html_link); + } + } + } + + // Finds img tags with links in the content. + if (variable_get('linkchecker_extract_from_img', 0) == 1) { + $imgs = $html_dom->getElementsByTagName('img'); + foreach ($imgs as $img) { + if (in_array($img->getAttribute('src'), $old_links)) { + $img->setAttribute('src', $new_html_link); + } + if (in_array($img->getAttribute('longdesc'), $old_links)) { + $img->setAttribute('longdesc', $new_html_link); + } + } + } + + // Finds object/param tags with links in the content. + if (variable_get('linkchecker_extract_from_object', 0) == 1) { + $objects = $html_dom->getElementsByTagName('object'); + foreach ($objects as $object) { + if (in_array($object->getAttribute('data'), $old_links)) { + $object->setAttribute('data', $new_html_link); + } + if (in_array($object->getAttribute('codebase'), $old_links)) { + $object->setAttribute('codebase', $new_html_link); + } + + // Finds param tags with links in the object tag. + $params = $object->getElementsByTagName('param'); + foreach ($params as $param) { + // @todo + // - Try to replace links in unkown "flashvars" values + // (e.g., file=http://, data=http://). + $names = array('archive', 'filename', 'href', 'movie', 'src', 'url'); + if ($param->hasAttribute('name') && in_array($param->getAttribute('name'), $names)) { + if (in_array($param->getAttribute('value'), $old_links)) { + $param->setAttribute('value', $new_html_link); + } + } + + $srcs = array('movie'); + if ($param->hasAttribute('src') && in_array($param->getAttribute('src'), $srcs)) { + if (in_array($param->getAttribute('value'), $old_links)) { + $param->setAttribute('value', $new_html_link); + } + } + } + } + } + + // Finds video tags with links in the content. + if (variable_get('linkchecker_extract_from_video', 0) == 1) { + $videos = $html_dom->getElementsByTagName('video'); + foreach ($videos as $video) { + if (in_array($video->getAttribute('poster'), $old_links)) { + $video->setAttribute('poster', $new_html_link); + } + if (in_array($video->getAttribute('src'), $old_links)) { + $video->setAttribute('src', $new_html_link); + } + + // Finds source tags with links in the video tag. + $sources = $video->getElementsByTagName('source'); + foreach ($sources as $source) { + if (in_array($source->getAttribute('src'), $old_links)) { + $source->setAttribute('src', $new_html_link); + } + } + // Finds track tags with links in the audio tag. + $tracks = $video->getElementsByTagName('track'); + foreach ($tracks as $track) { + if (in_array($track->getAttribute('src'), $old_links)) { + $track->setAttribute('src', $new_html_link); + } + } + } + } + + // Set the updated $text for the calling function. + $text = filter_dom_serialize($html_dom); + } + } +} + +/** + * Customized clone of core check_markup() with additional filter blacklist. + * + * See http://api.drupal.org/api/function/check_markup/7 for API documentation. + */ +function _linkchecker_check_markup($text, $format_id = NULL, $langcode = '', $cache = FALSE) { + if (!isset($text)) { + return ''; + } + + if (!isset($format_id)) { + $format_id = filter_fallback_format(); + } + // If the requested text format does not exist, the text cannot be filtered. + if (!$format = filter_format_load($format_id)) { + linkchecker_watchdog_log('filter', 'Missing text format: %format.', array('%format' => $format_id), WATCHDOG_ALERT); + return ''; + } + + // Check for a cached version of this piece of text. + $cache = $cache && !empty($format->cache); + $cache_id = ''; + if ($cache) { + $cache_id = 'linkchecker:' . $format->format . ':' . $langcode . ':' . hash('sha256', $text); + if ($cached = cache_get($cache_id, 'cache_filter')) { + return $cached->data; + } + } + + // Convert all Windows and Mac newlines to a single newline, so filters only + // need to deal with one possibility. + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + // Get a complete list of filters, ordered properly. + $filters = filter_list_format($format->format); + $filter_info = filter_get_filters(); + + // Do not run placeholder or special tag filters used as references to nodes + // like 'weblink' or 'weblinks' node types. If the original link node is + // updated, all links are automatically up-to-date and there is no need to + // notify about the broken link on all nodes having a link reference in + // content. This would only confuse the authors as they may also not be able + // to fix the source node of the reference. + $filters_blacklist = array_keys(array_filter(variable_get('linkchecker_filter_blacklist', explode('|', LINKCHECKER_DEFAULT_FILTER_BLACKLIST)))); + + // Give filters the chance to escape HTML-like data such as code or formulas. + foreach ($filters as $name => $filter) { + if (!in_array($name, $filters_blacklist)) { + if ($filter->status && isset($filter_info[$name]['prepare callback']) && function_exists($filter_info[$name]['prepare callback'])) { + $function = $filter_info[$name]['prepare callback']; + $text = $function($text, $filter, $format, $langcode, $cache, $cache_id); + } + } + } + + // Perform filtering. + foreach ($filters as $name => $filter) { + if (!in_array($name, $filters_blacklist)) { + if ($filter->status && isset($filter_info[$name]['process callback']) && function_exists($filter_info[$name]['process callback'])) { + $function = $filter_info[$name]['process callback']; + $text = $function($text, $filter, $format, $langcode, $cache, $cache_id); + } + } + } + + // Store in cache with a minimum expiration time of 1 day. + if ($cache) { + cache_set($cache_id, $text, 'cache_filter', REQUEST_TIME + (60 * 60 * 24)); + } + + return $text; +} + +/** + * Get the path of an URL. + * + * @param string $url + * The http/https URL to parse. + * + * @return string + * Full qualified URL with absolute path of the URL. + */ +function _linkchecker_absolute_content_path($url) { + + // Parse the URL and make sure we can handle the schema. + $uri = @parse_url($url); + + if ($uri == FALSE) { + return NULL; + } + + if (!isset($uri['scheme'])) { + return NULL; + } + + // Break if the schema is not supported. + if (!in_array($uri['scheme'], array('http', 'https'))) { + return NULL; + } + + $scheme = isset($uri['scheme']) ? $uri['scheme'] . '://' : ''; + $user = isset($uri['user']) ? $uri['user'] . ($uri['pass'] ? ':' . $uri['pass'] : '') . '@' : ''; + $port = isset($uri['port']) ? $uri['port'] : 80; + $host = $uri['host'] . ($port != 80 ? ':' . $port : ''); + $path = isset($uri['path']) ? $uri['path'] : '/'; + + // Glue the URL variables. + $absolute_url = $scheme . $user . $host . $path; + + // Find the last slash and remove all after the last slash to get the path. + $last_slash = strrpos($absolute_url, '/'); + $absolute_content_url = drupal_substr($absolute_url, 0, $last_slash + 1); + + return $absolute_content_url; +} + +/** + * Verifies against blacklists, if the link status should be checked or not. + */ +function _linkchecker_link_check_status_filter($url) { + $status = TRUE; + + // Is url in domain blacklist? + $urls = variable_get('linkchecker_disable_link_check_for_urls', LINKCHECKER_RESERVED_DOCUMENTATION_DOMAINS); + if (!empty($urls) && preg_match('/' . implode('|', array_map(create_function('$links', 'return preg_quote($links, \'/\');'), preg_split('/(\r\n?|\n)/', $urls))) . '/', $url)) { + $status = FALSE; + } + + // Protocol whitelist check (without curl, only http/https is supported). + if (!preg_match('/^(https?):\/\//i', $url)) { + $status = FALSE; + } + + return $status; +} + +/** + * Returns a list of HTTP status codes. + */ +function _linkchecker_response_codes() { + return array( + 100 => '(100) - Continue', + 101 => '(101) - Switching Protocols', + 200 => '(200) - OK', + 201 => '(201) - Created', + 202 => '(202) - Accepted', + 203 => '(203) - Non-Authoritative Information', + 204 => '(204) - No Content', + 205 => '(205) - Reset Content', + 206 => '(206) - Partial Content', + 300 => '(300) - Multiple Choices', + 301 => '(301) - Moved Permanently', + 302 => '(302) - Found', + 303 => '(303) - See Other', + 304 => '(304) - Not Modified', + 305 => '(305) - Use Proxy', + 307 => '(307) - Temporary Redirect', + 400 => '(400) - Bad Request', + 401 => '(401) - Unauthorized', + 402 => '(402) - Payment Required', + 403 => '(403) - Forbidden', + 404 => '(404) - Not Found', + 405 => '(405) - Method Not Allowed', + 406 => '(406) - Not Acceptable', + 407 => '(407) - Proxy Authentication Required', + 408 => '(408) - Request Time-out', + 409 => '(409) - Conflict', + 410 => '(410) - Gone', + 411 => '(411) - Length Required', + 412 => '(412) - Precondition Failed', + 413 => '(413) - Request Entity Too Large', + 414 => '(414) - Request-URI Too Large', + 415 => '(415) - Unsupported Media Type', + 416 => '(416) - Requested range not satisfiable', + 417 => '(417) - Expectation Failed', + 500 => '(500) - Internal Server Error', + 501 => '(501) - Not Implemented', + 502 => '(502) - Bad Gateway', + 503 => '(503) - Service Unavailable', + 504 => '(504) - Gateway Time-out', + 505 => '(505) - HTTP Version not supported', + -10053 => '(-10053) - Connection timed out. Time to First Byte Timeout.', + -11001 => '(-11001) - Host not found', + ); +} + +/** + * Validates an HTTP status code. + * + * @param int $code + * A numeric HTTP status code. + * + * @return bool + * TRUE if the status code is valid, otherwise FALSE. + */ +function _linkchecker_isvalid_response_code($code) { + $codes = _linkchecker_response_codes(); + + return array_key_exists($code, $codes); +} + +/** + * Return all content type enable with link checking. + * + * @return array + * An array of node type names, keyed by the type. + */ +function linkchecker_scan_node_types() { + $types = array(); + foreach (node_type_get_names() as $type => $name) { + if (variable_get('linkchecker_scan_node_' . $type, FALSE)) { + $types[$type] = $type; + } + } + return $types; +} + +/** + * Return all content type enable with comment link checking. + * + * @return array + * An array of node type names, keyed by the type. + */ +function linkchecker_scan_comment_types() { + $types = array(); + foreach (node_type_get_names() as $type => $name) { + if (variable_get('linkchecker_scan_comment_' . $type, FALSE)) { + $types[$type] = $type; + } + } + return $types; +} + +/** + * Unpublishes all nodes having the specified link id. + * + * @param int $lid + * A link ID that have reached a defined failcount. + */ +function _linkchecker_unpublish_nodes($lid) { + $result = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $lid)); + foreach ($result as $row) { + // Explicitly don't use node_load_multiple() or the module may run + // into issues like http://drupal.org/node/1210606. With this logic + // nodes can be updated until an out of memory occurs and further + // updates will be made on the remaining nodes only. + $node = node_load($row->nid); + $node->status = NODE_NOT_PUBLISHED; + node_save($node); + linkchecker_watchdog_log('linkchecker', 'Set @type %title to unpublished.', array('@type' => $node->type, '%title' => $node->title)); + } +} + +/** + * Load link as object. + * + * @param int $lid + * The link id. + * + * @return object + */ +function linkchecker_link_load($lid) { + return db_query('SELECT * FROM {linkchecker_link} WHERE lid = :lid', array(':lid' => $lid))->fetchObject(); +} + +/** + * Impersonates another user, see http://drupal.org/node/287292#comment-3162350. + * + * Each time this function is called, the active user is saved and $new_user + * becomes the active user. Multiple calls to this function can be nested, + * and session saving will be disabled until all impersonation attempts have + * been reverted using linkchecker_revert_user(). + * + * @param int|object $new_user + * User to impersonate, either a UID or a user object. + * + * @return object + * Current user object. + * + * @see linkchecker_revert_user() + */ +function linkchecker_impersonate_user($new_user = NULL) { + global $user; + $user_original = &drupal_static(__FUNCTION__); + + if (!isset($new_user)) { + if (isset($user_original) && !empty($user_original)) { + // Restore the previous user from the stack. + $user = array_pop($user_original); + + // Re-enable session saving if we are no longer impersonating a user. + if (empty($user_original)) { + drupal_save_session(TRUE); + } + } + } + else { + // Push the original user onto the stack and prevent session saving. + $user_original[] = $user; + drupal_save_session(FALSE); + + if (is_numeric($new_user)) { + $user = user_load($new_user); + } + else { + $user = is_object($new_user) ? $new_user : (object) $new_user; + } + } + + return $user; +} + +/** + * Reverts to the previous user after impersonating. + * + * @return object + * Current user. + * + * @see linkchecker_impersonate_user() + */ +function linkchecker_revert_user() { + return linkchecker_impersonate_user(); +} + +/** + * Checks if this entity is the default revision (published). + * + * @param object $entity + * The entity object, e.g., $node. + * + * @return bool + * TRUE if the entity is the default revision, FALSE otherwise. + */ +function _linkchecker_isdefaultrevision($entity) { + // D7 "Forward revisioning" is complex and causes a node_save() with the + // future node in node table. This fires hook_node_update() twice and cause + // abnormal behaviour in linkchecker. + // + // The steps taken by Workbench Moderation is to save the forward revision + // first and overwrite this with the live version in a shutdown function in + // a second step. This will confuse linkchecker. D7 has no generic property + // in the node object, if the node that is updated is the 'published' version + // or only a draft of a future version. + // + // This behaviour will change in D8 where $node->isDefaultRevision has been + // introduced. See below links for more details. + // - http://drupal.org/node/1879482 + // - http://drupal.org/node/218755 + // - http://drupal.org/node/1522154 + // + // Every moderation module saving a forward revision needs to return FALSE. + // @todo: Refactor this workaround under D8. + + // Workbench Moderation module. + if (module_exists('workbench_moderation') && workbench_moderation_node_type_moderated($entity->type) === TRUE && empty($entity->workbench_moderation['updating_live_revision'])) { + return FALSE; + } + + return TRUE; +} + +/** + * Returns the language code of the given entity. + * + * Backward compatibility layer to ensure that installations running an older + * version of core where entity_language() is not avilable do not break. + * + * @param string $entity_type + * An entity type. + * @param object $entity + * An entity object. + * + * @return string + * The entity language code. + */ +function linkchecker_entity_language($entity_type, $entity) { + $langcode = NULL; + if (function_exists('entity_language')) { + $langcode = entity_language($entity_type, $entity); + } + elseif (!empty($entity->language)) { + $langcode = $entity->language; + } + return $langcode; +} + +/** + * Return all the values of one-dimensional and multidimensional arrays. + * + * @return array + * Returns all the values from the input array and indexes the array numerically. + */ +function _linkchecker_array_values_recursive(array $array) { + $array_values = array(); + + foreach ($array as $value) { + if (is_array($value)) { + $array_values = array_merge($array_values, _linkchecker_array_values_recursive($value)); + } + else { + $array_values[] = $value; + } + } + + return $array_values; +} + +/** + * Check if the link is an internal URL or not. + * + * @param object $link + * Link object. + * + * @return bool + * TRUE if link is internal, otherwise FALSE. + */ +function _linkchecker_is_internal_url(&$link) { + global $base_url; + + if (strpos($link->url, $base_url) === 0) { + $link->internal = trim(substr($link->url, strlen($base_url)), " \t\r\n\0\\/"); + return TRUE; + } +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.pages.inc b/dkan/modules/contrib/linkchecker/linkchecker.pages.inc new file mode 100644 index 000000000..0e96aedc9 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.pages.inc @@ -0,0 +1,306 @@ +<?php + +/** + * @file + * User page callbacks for the linkchecker module. + */ + +/** + * Menu callback for general reporting. + * + * @return string + * Themed report page. + */ +function linkchecker_admin_report_page() { + + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + + // Search for broken links in nodes and comments and blocks of all users. + // @todo Try to make UNION'ed subselect resultset smaller. + $subquery4 = db_select('linkchecker_node', 'ln') + ->distinct() + ->fields('ln', array('lid')); + + $subquery3 = db_select('linkchecker_comment', 'lc') + ->distinct() + ->fields('lc', array('lid')); + + $subquery2 = db_select('linkchecker_block_custom', 'lb') + ->distinct() + ->fields('lb', array('lid')); + + // UNION all linkchecker type tables. + $subquery1 = db_select($subquery2->union($subquery3)->union($subquery4), 'q1')->fields('q1', array('lid')); + + // Build pager query. + $query = db_select('linkchecker_link', 'll')->extend('PagerDefault')->extend('TableSort'); + $query->innerJoin($subquery1, 'q2', 'q2.lid = ll.lid'); + $query->fields('ll'); + $query->condition('ll.last_checked', 0, '<>'); + $query->condition('ll.status', 1); + $query->condition('ll.code', $ignore_response_codes, 'NOT IN'); + + return _linkchecker_report_page($query); +} + +/** + * Menu callback for author specific reporting. + * + * @param object $account + * The user account. + * + * @return string + * Themed report page. + */ +function linkchecker_user_report_page($account) { + drupal_set_title($account->name); + + $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403")); + + // Build query for broken links in nodes of the current user. + $subquery2 = db_select('node', 'n'); + $subquery2->innerJoin('node_revision', 'r', 'r.vid = n.vid'); + $subquery2->innerJoin('linkchecker_node', 'ln', 'ln.nid = n.nid'); + $subquery2->innerJoin('linkchecker_link', 'll', 'll.lid = ln.lid'); + $subquery2->condition('ll.last_checked', 0, '<>'); + $subquery2->condition('ll.status', 1); + $subquery2->condition('ll.code', $ignore_response_codes, 'NOT IN'); + $subquery2->condition(db_or() + ->condition('n.uid', $account->uid) + ->condition('r.uid', $account->uid) + ); + $subquery2->distinct(); + $subquery2->fields('ll', array('lid')); + + $comment_types = linkchecker_scan_comment_types(); + if (!empty($comment_types)) { + // Build query for broken links in nodes and comments of the current user. + $subquery3 = db_select('comment', 'c'); + $subquery3->innerJoin('linkchecker_comment', 'lc', 'lc.cid = c.cid'); + $subquery3->innerJoin('linkchecker_link', 'll', 'll.lid = lc.lid'); + $subquery3->condition('ll.last_checked', 0, '<>'); + $subquery3->condition('ll.status', 1); + $subquery3->condition('ll.code', $ignore_response_codes, 'NOT IN'); + $subquery3->condition('c.uid', $account->uid); + $subquery3->distinct(); + $subquery3->fields('ll', array('lid')); + + // UNION the linkchecker_node and linkchecker_comment tables. + $subquery1 = db_select($subquery2->union($subquery3), 'q1')->fields('q1', array('lid')); + } + else { + // Build query for broken links in nodes of the current user. + $subquery1 = db_select($subquery2, 'q1')->fields('q1', array('lid')); + } + + // Build pager query. + $query = db_select('linkchecker_link', 'll')->extend('PagerDefault')->extend('TableSort'); + $query->innerJoin($subquery1, 'q2', 'q2.lid = ll.lid'); + $query->fields('ll'); + $query->condition('ll.last_checked', 0, '<>'); + $query->condition('ll.status', 1); + $query->condition('ll.code', $ignore_response_codes, 'NOT IN'); + + return _linkchecker_report_page($query, $account); +} + +/** + * Builds the HTML report page table with pager. + * + * @param SelectQueryInterface $query + * The pager query for the report page. Can be per user report or global. + * @param object|null $account + * The user account object. + * + * @return string + * Themed report page. + */ +function _linkchecker_report_page($query, $account = NULL) { + + $links_unchecked = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE last_checked = :last_checked AND status = :status', array(':last_checked' => 0, ':status' => 1))->fetchField(); + if ($links_unchecked > 0) { + $links_all = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE status = :status', array(':status' => 1))->fetchField(); + drupal_set_message(format_plural($links_unchecked, + 'There is 1 unchecked link of about @links_all links in the database. Please be patient until all links have been checked via cron.', + 'There are @count unchecked links of about @links_all links in the database. Please be patient until all links have been checked via cron.', + array('@links_all' => $links_all)), 'warning'); + } + + $header = array( + array('data' => t('URL'), 'field' => 'url', 'sort' => 'desc'), + array('data' => t('Response'), 'field' => 'code', 'sort' => 'desc'), + array('data' => t('Error'), 'field' => 'error'), + array('data' => t('Operations')), + ); + + $result = $query + ->limit(50) + ->orderByHeader($header) + ->execute(); + + // Evaluate permission once for performance reasons. + $access_edit_link_settings = user_access('edit link settings'); + $access_administer_blocks = user_access('administer blocks'); + $access_administer_redirects = user_access('administer redirects'); + + $rows = array(); + foreach ($result as $link) { + // Get the node, block and comment IDs that refer to this broken link and + // that the current user has access to. + $nids = _linkchecker_link_node_ids($link, $account); + $cids = _linkchecker_link_comment_ids($link, $account); + $bids = _linkchecker_link_block_ids($link); + + // If the user does not have access to see this link anywhere, do not + // display it, for reasons explained in _linkchecker_link_access(). We + // still need to fill the table row, though, so as not to throw off the + // number of items in the pager. + if (empty($nids) && empty($cids) && empty($bids)) { + $rows[] = array(array('data' => t('Permission restrictions deny you access to this broken link.'), 'colspan' => count($header))); + continue; + } + + $links = array(); + + // Show links to link settings. + if ($access_edit_link_settings) { + $links[] = l(t('Edit link settings'), 'linkchecker/' . $link->lid . '/edit', array('query' => drupal_get_destination())); + } + + // Show link to nodes having this broken link. + foreach ($nids as $nid) { + $links[] = l(t('Edit node @node', array('@node' => $nid)), 'node/' . $nid . '/edit', array('query' => drupal_get_destination())); + } + + // Show link to comments having this broken link. + $comment_types = linkchecker_scan_comment_types(); + if (module_exists('comment') && !empty($comment_types)) { + foreach ($cids as $cid) { + $links[] = l(t('Edit comment @comment', array('@comment' => $cid)), 'comment/' . $cid . '/edit', array('query' => drupal_get_destination())); + } + } + + // Show link to blocks having this broken link. + if ($access_administer_blocks) { + foreach ($bids as $bid) { + $links[] = l(t('Edit block @block', array('@block' => $bid)), 'admin/structure/block/manage/block/' . $bid . '/configure', array('query' => drupal_get_destination())); + } + } + + // Show link to redirect this broken internal link. + if (module_exists('redirect') && $access_administer_redirects && _linkchecker_is_internal_url($link)) { + $links[] = l(t('Create redirection'), 'admin/config/search/redirect/add', array('query' => array('source' => $link->internal, drupal_get_destination()))); + } + + // Create table data for output. + $rows[] = array( + 'data' => array( + l(_filter_url_trim($link->url, 40), $link->url), + $link->code, + check_plain($link->error), + theme('item_list', array('items' => $links)), + ), + ); + } + + $build['linkchecker_table'] = array( + '#theme' => 'table', + '#header' => $header, + '#rows' => $rows, + '#empty' => t('No broken links have been found.'), + ); + $build['linkchecker_pager'] = array('#theme' => 'pager'); + + return $build; +} + +/** + * Edit link settings form. + */ +function linkchecker_link_edit_form($form, &$form_state, $link) { + + $form['settings'] = array( + '#type' => 'fieldset', + '#title' => t('Settings'), + '#collapsible' => FALSE, + '#description' => t('The link <a href="@url">@url</a> was last checked on @last_checked and failed @fail_count times.', array('@url' => $link->url, '@fail_count' => $link->fail_count, '@last_checked' => format_date($link->last_checked))) + ); + + $form['settings']['lid'] = array('#type' => 'value', '#value' => $link->lid); + $form['settings']['url'] = array('#type' => 'value', '#value' => $link->url); + + $form['settings']['method'] = array( + '#type' => 'select', + '#title' => t('Select request method'), + '#default_value' => $link->method, + '#options' => array( + 'HEAD' => t('HEAD'), + 'GET' => t('GET'), + ), + '#description' => t('Select the request method used for link checks of this link. If you encounter issues like status code 500 errors with the HEAD request method you should try the GET request method before ignoring a link.'), + ); + + $form['settings']['status'] = array( + '#default_value' => $link->status, + '#type' => 'checkbox', + '#title' => t('Check link status'), + '#description' => t("Uncheck if you wish to ignore this link. Use this setting only as a last resort if there is no other way to solve a failed link check."), + ); + + $form['maintenance'] = array( + '#type' => 'fieldset', + '#title' => t('Maintenance'), + '#collapsible' => FALSE, + ); + + $form['maintenance']['recheck'] = array( + '#default_value' => 0, + '#type' => 'checkbox', + '#title' => t('Re-check link status on next cron run'), + '#description' => t('Enable this checkbox if you want to re-check the link during the next cron job rather than wait for the next scheduled check on @date.', array('@date' => format_date($link->last_checked + variable_get('linkchecker_check_links_interval', 2419200)))), + ); + + $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration')); + $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults')); + + return $form; +} + +/** + * Edit link settings form submit handler. + */ +function linkchecker_link_edit_form_submit($form, &$form_state) { + // Force link re-check asap. + if ($form_state['values']['recheck']) { + db_update('linkchecker_link') + ->condition('lid', $form_state['values']['lid']) + ->fields(array('last_checked' => 0)) + ->execute(); + drupal_set_message(t('The link %url will be checked again on the next cron run.', array('%url' => $form_state['values']['url']))); + } + + if ($form_state['values']['method'] != $form['settings']['method']['#default_value']) { + // Update settings and reset statistics for a quick re-check. + db_update('linkchecker_link') + ->condition('lid', $form_state['values']['lid']) + ->fields(array( + 'method' => $form_state['values']['method'], + 'fail_count' => 0, + 'last_checked' => 0, + 'status' => $form_state['values']['status'], + )) + ->execute(); + drupal_set_message(t('The link settings for %url have been saved and the fail counter has been reset.', array('%url' => $form_state['values']['url']))); + } + else { + // Update setting only. + db_update('linkchecker_link') + ->condition('lid', $form_state['values']['lid']) + ->fields(array( + 'method' => $form_state['values']['method'], + 'status' => $form_state['values']['status'], + )) + ->execute(); + drupal_set_message(t('The link settings for %url have been saved.', array('%url' => $form_state['values']['url']))); + } +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.redirect.inc b/dkan/modules/contrib/linkchecker/linkchecker.redirect.inc new file mode 100644 index 000000000..0b1ea2092 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.redirect.inc @@ -0,0 +1,52 @@ +<?php + +/** + * @file + * Redirect interface to linkchecker functionalities. + */ + +/** + * Implements hook_redirect_insert(). + */ +function linkchecker_redirect_insert($redirect) { + linkchecker_redirect_update($redirect); +} + +/** + * Implements hook_redirect_update(). + */ +function linkchecker_redirect_update($redirect) { + // It's unknown if this is a redirect for HTTP/HTTPS or the encoded urls. + $url_http = url($redirect->source, array('absolute' => TRUE, $redirect->source_options)); + $url_https = url($redirect->source, array('absolute' => TRUE, 'https' => TRUE, $redirect->source_options)); + + $urls = array( + $url_http, + $url_https, + rawurldecode($url_http), + rawurldecode($url_https), + ); + + _linkchecker_redirect_reset($urls); +} + +/** + * Reset last_checked status. + * + * @param array $urls + * An array of urls that should be checked on next cron run. + */ +function _linkchecker_redirect_reset($urls = array()) { + $urls = array_unique($urls); + + $num_updated = db_update('linkchecker_link') + ->condition('urlhash', array_map('drupal_hash_base64', $urls)) + ->condition('fail_count', 0, '>') + ->condition('status', 1) + ->fields(array('last_checked' => 0)) + ->execute(); + + if ($num_updated) { + drupal_set_message(t('The link %url will be checked again on the next cron run.', array('%url' => $urls[0]))); + } +} diff --git a/dkan/modules/contrib/linkchecker/linkchecker.test b/dkan/modules/contrib/linkchecker/linkchecker.test new file mode 100644 index 000000000..3a8f712e3 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/linkchecker.test @@ -0,0 +1,648 @@ +<?php + +/** + * @file + * Test file for Link checker module. + */ + +class LinkCheckerLinkExtractionTest extends DrupalWebTestCase { + + public static function getInfo() { + return array( + 'name' => 'Link checker link extraction tests', + 'description' => 'Test Link checker module link extraction functionality.', + 'group' => 'Link checker', + ); + } + + public function setUp() { + parent::setUp('linkchecker', 'path'); + + $full_html_format = filter_format_load('full_html'); + $permissions = array( + 'create page content', + 'edit own page content', + 'administer url aliases', + 'create url aliases', + filter_permission_name($full_html_format), + ); + + $user = $this->drupalCreateUser($permissions); + $this->drupalLogin($user); + + } + + public function testLinkCheckerCreateNodeWithLinks() { + + // Enable all node type page for link extraction. + variable_set('linkchecker_scan_node_page', TRUE); + variable_set('linkchecker_scan_blocks', 1); + + // Core enables the URL filter for "Full HTML" by default. + // -> Blacklist / Disable URL filter for testing. + variable_set('linkchecker_filter_blacklist', array('filter_url' => 'filter_url')); + + // Extract from all link checker supported HTML tags. + variable_set('linkchecker_extract_from_a', 1); + variable_set('linkchecker_extract_from_audio', 1); + variable_set('linkchecker_extract_from_embed', 1); + variable_set('linkchecker_extract_from_iframe', 1); + variable_set('linkchecker_extract_from_img', 1); + variable_set('linkchecker_extract_from_object', 1); + variable_set('linkchecker_extract_from_video', 1); + + $body = <<<EOT +<!-- UNSUPPORTED for link checking: --> + +<a href="mailto:test@example.com">Send email</a> +<a href="javascript:foo()">Execute JavaScript</a> + +<!-- SUPPORTED for link checking: --> + +<!-- URL in HTML comment: http://example.com/test-if-url-filter-is-disabled --> + +<!-- Relative URLs --> +<img src="test.png" alt="Test image 1" /> +<img src="../foo1/test.png" alt="Test image 2" /> + +<a href="../foo1/bar1">../foo1/bar1</a> +<a href="./foo2/bar2">./foo2/bar2</a> +<a href="../foo3/../foo4/foo5">../foo3/../foo4/foo5</a> +<a href="./foo4/../foo5/foo6">./foo4/../foo5/foo6</a> +<a href="./foo4/./foo5/foo6">./foo4/./foo5/foo6</a> +<a href="./test/foo bar/is_valid-hack.test">./test/foo bar/is_valid-hack.test</a> + +<!-- URL with uncommon chars that could potentially fail to extract. See http://drupal.org/node/465462. --> +<a href="http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149">URL with uncommon chars</a> +<a href="http://example.com/foo bar/is_valid-hack.test">URL with space</a> +<a href="http://example.com/ajax.html#key1=value1&key2=value2">URL with ajax query params</a> +<a href="http://example.com/test.html#test">URL with standard anchor</a> + +<!-- object tag: Embed SWF files --> +<object width="150" height="116" + type="application/x-shockwave-flash" + data="http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt"> + <param name="movie" value="http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt" /> + <img src="flash.png" width="150" height="116" alt="" /> <br /> + No weather report visible? At <a href="http://www.msn.de/">MSN</a> + you are able to find the weather report missing here and the + Flash plugin can be found at <a href="http://www.adobe.com/">Adobe</a>. +</object> + +<!-- object tag: Embed Quicktime Movies on HTML pages --> +<object width="420" height="282" + classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" + codebase="http://www.apple.com/qtactivex/qtplugin.cab"> + <param name="src" value="http://example.net/video/foo1.mov" /> + <param name="href" value="http://example.net/video/foo2.mov" /> + <param name="controller" value="true" /> + <param name="autoplay" value="false" /> + <param name="scale" value="aspect" /> + <!--[if gte IE 7]> <!--> + <object type="video/quicktime" data="http://example.net/video/foo3.mov" width="420" height="282"> + <param name="controller" value="true" /> + <param name="autoplay" value="false" /> + </object> + <!--<![endif]--> +</object> + +<!-- object tag: Play MP4 videos on HTML pages --> +<object data="http://example.org/video/foo1.mp4" type="video/mp4" width="420" height="288"> + <param name="src" value="http://example.org/video/foo2.mp4" /> + <param name="autoplay" value="false" /> + <param name="autoStart" value="0" /> + <a href="http://example.org/video/foo3.mp4">/video/foo3.mp4</a> +</object> + +<!-- object tag: Play MP4 videos with Quicktime --> +<object width="420" height="282" codebase="http://www.apple.com/qtactivex/qtplugin.cab"> + <param name="src" value="http://example.org/video/foo4.mp4" /> + <param name="href" value="http://example.org/video/foo5.mp4" /> + <param name="controller" value="true" /> + <param name="autoplay" value="false" /> + <param name="scale" value="aspect" /> + <!--[if gte IE 7]> <!--> + <object type="video/quicktime" data="http://example.org/video/foo6.mp4" width="420" height="282"> + <param name="controller" value="true" /> + <param name="autoplay" value="false" /> + </object> + <!--<![endif]--> +</object> + +<!-- object tag: Play flash videos on HTML pages --> +<object type="application/x-shockwave-flash" data="http://example.org/video/player1.swf" width="420" height="270"> + <param name="movie" value="http://example.org/video/player2.swf" /> + <param src="movie" value="http://example.org/video/player3.swf" /> + <param name="flashvars" value="file=http://example.org/video/foo1.flv&width=420&height=270" /> +</object> + +<!-- Embed ActiveX control as objekt --> +<object width="267" height="175" classid="CLSID:05589FA1-C356-11CE-BF01-00AA0055595A"> + <param name="filename" value="ritmo.mid"> +</object> + +<!-- Add inline frames --> +<iframe src="http://example.com/iframe/" name="ExampleIFrame" width="300" height="200"> + <p>Your browser does not support inline frames.</p> +</iframe> + +<!-- https://developer.mozilla.org/en/Using_audio_and_video_in_Firefox --> + +<!-- http://www.theora.org/cortado/ --> +<video src="my_ogg_video.ogg" controls width="320" height="240"> + <object type="application/x-java-applet" width="320" height="240"> + <param name="archive" value="http://www.theora.org/cortado.jar"> + <param name="code" value="com.fluendo.player.Cortado.class"> + <param name="url" value="my_ogg_video.ogg"> + <p>You need to install Java to play this file.</p> + </object> +</video> + +<video src="video.ogv" controls> + <object data="flvplayer1.swf" type="application/x-shockwave-flash"> + <param name="movie" value="flvplayer2.swf" /> + </object> +</video> + +<video controls> + <source src="http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.ogg" type="video/ogg"> + <source src="http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.mov"> + Your browser does not support the <code>video</code> element. +</video> + +<video controls> + <source src="foo.ogg" type="video/ogg; codecs="dirac, speex""> + Your browser does not support the <code>video</code> element. +</video> + +<video src="http://v2v.cc/~j/theora_testsuite/320x240.ogg" controls> + Your browser does not support the <code>video</code> element. +</video> +EOT; + + // Save folder names in variables for reuse. + $folder1 = $this->randomName(10); + $folder2 = $this->randomName(5); + + // Fill node array. + $langcode = LANGUAGE_NONE; + $edit = array(); + $edit['title'] = $this->randomName(32); + $edit["body[$langcode][0][value]"] = $body; + $edit['path[alias]'] = $folder1 . '/' . $folder2; + $edit["body[$langcode][0][format]"] = 'full_html'; + + // Extract only full qualified URLs. + variable_set('linkchecker_check_links_types', 1); + + // Verify path input field appears on add "Basic page" form. + $this->drupalGet('node/add/page'); + // Verify path input is present. + $this->assertFieldByName('path[alias]', '', 'Path input field present on add Basic page form.'); + + // Save node. + $this->drupalPost('node/add/page', $edit, t('Save')); + $this->assertText(t('@type @title has been created.', array('@type' => 'Basic page', '@title' => $edit['title'])), 'Node was created.'); + + // Verify if the content links are extracted properly. + $urls_fqdn = array( + 'http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149', + 'http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt', + 'http://www.msn.de/', + 'http://www.adobe.com/', + 'http://www.apple.com/qtactivex/qtplugin.cab', + 'http://example.net/video/foo1.mov', + 'http://example.net/video/foo2.mov', + 'http://example.net/video/foo3.mov', + 'http://example.org/video/foo1.mp4', + 'http://example.org/video/foo2.mp4', + 'http://example.org/video/foo3.mp4', + 'http://example.org/video/foo4.mp4', + 'http://example.org/video/foo5.mp4', + 'http://example.org/video/foo6.mp4', + 'http://example.org/video/player1.swf', + 'http://example.org/video/player2.swf', + 'http://example.org/video/player3.swf', + 'http://example.com/iframe/', + 'http://www.theora.org/cortado.jar', + 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.ogg', + 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.mov', + 'http://v2v.cc/~j/theora_testsuite/320x240.ogg', + 'http://example.com/foo bar/is_valid-hack.test', + 'http://example.com/ajax.html#key1=value1&key2=value2', + 'http://example.com/test.html#test', + ); + + foreach ($urls_fqdn as $org_url => $check_url) { + $link = $this->getLinkCheckerLink($check_url); + if ($link) { + $this->assertIdentical($link->url, $check_url, format_string('Absolute URL %org_url matches expected result %check_url.', array('%org_url' => $org_url, '%check_url' => $check_url))); + } + else { + $this->fail(format_string('URL %check_url not found.', array('%check_url' => $check_url))); + } + } + + // Check if the number of links is correct. + // - Verifies if all HTML tag regexes matched. + // - Verifies that the linkchecker filter blacklist works well. + $urls_in_database = $this->getLinkCheckerLinksCount(); + $urls_expected_count = count($urls_fqdn); + $this->assertEqual($urls_in_database, $urls_expected_count, format_string('Found @urls_in_database URLs in database matches expected result of @urls_expected_count.', array('@urls_in_database' => $urls_in_database, '@urls_expected_count' => $urls_expected_count))); + + // Extract all URLs including relative path. + variable_set('clean_url', 1); + variable_set('linkchecker_check_links_types', 0); + + $node = $this->drupalGetNodeByTitle($edit['title']); + $this->assertTrue($node, 'Node found in database.'); + $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save')); + $this->assertRaw(t('@type %title has been updated.', array('@type' => 'Basic page', '%title' => $edit['title']))); + + // @todo Path alias seems not saved!??? + // $this->assertIdentical($node->path, $edit['path'], format_string('URL alias "@node-path" matches path "@edit-path".', array('@node-path' => $node->path, '@edit-path' => $edit['path']))); + + // Verify if the content links are extracted properly. + global $base_root, $base_path; + $urls_relative = array( + '../foo1/test.png' => $base_root . $base_path . 'foo1/test.png', + 'test.png' => $base_root . $base_path . $folder1 . '/test.png', + '../foo1/bar1' => $base_root . $base_path . 'foo1/bar1', + './foo2/bar2' => $base_root . $base_path . $folder1 . '/foo2/bar2', + '../foo3/../foo4/foo5' => $base_root . $base_path . 'foo4/foo5', + './foo4/../foo5/foo6' => $base_root . $base_path . $folder1 . '/foo5/foo6', + './foo4/./foo5/foo6' => $base_root . $base_path . $folder1 . '/foo4/foo5/foo6', + './test/foo bar/is_valid-hack.test' => $base_root . $base_path . $folder1 . '/test/foo bar/is_valid-hack.test', + 'flash.png' => $base_root . $base_path . $folder1 . '/flash.png', + 'ritmo.mid' => $base_root . $base_path . $folder1 . '/ritmo.mid', + 'my_ogg_video.ogg' => $base_root . $base_path . $folder1 . '/my_ogg_video.ogg', + 'video.ogv' => $base_root . $base_path . $folder1 . '/video.ogv', + 'flvplayer1.swf' => $base_root . $base_path . $folder1 . '/flvplayer1.swf', + 'flvplayer2.swf' => $base_root . $base_path . $folder1 . '/flvplayer2.swf', + 'foo.ogg' => $base_root . $base_path . $folder1 . '/foo.ogg', + ); + $this->verbose(theme('item_list', array('items' => $urls_relative, 'title' => 'Verify if following relative URLs exists:'))); + + $links_debug = array(); + $result = db_query('SELECT url FROM {linkchecker_link}'); + foreach ($result as $row) { + $links_debug[] = $row->url; + } + $this->verbose(theme('item_list', array('items' => $links_debug, 'title' => 'Following URLs exists:'))); + + foreach ($urls_relative as $org_url => $check_url) { + $link = $this->getLinkCheckerLink($check_url); + if ($link) { + $this->assertIdentical($link->url, $check_url, format_string('Relative URL %org_url matches expected result %check_url.', array('%org_url' => $org_url, '%check_url' => $check_url))); + } + else { + $this->fail(format_string('URL %check_url not found.', array('%check_url' => $check_url))); + } + } + + // Check if the number of links is correct. + $urls_in_database = $this->getLinkCheckerLinksCount(); + $urls_expected_count = count($urls_fqdn + $urls_relative); + $this->assertEqual($urls_in_database, $urls_expected_count, format_string('Found @urls_in_database URLs in database matches expected result of @urls_expected_count.', array('@urls_in_database' => $urls_in_database, '@urls_expected_count' => $urls_expected_count))); + + // Verify if link check has been enabled for normal URLs. + $urls = array( + 'http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149', + 'http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt', + 'http://www.msn.de/', + 'http://www.adobe.com/', + 'http://www.apple.com/qtactivex/qtplugin.cab', + 'http://www.theora.org/cortado.jar', + 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.ogg', + 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.mov', + 'http://v2v.cc/~j/theora_testsuite/320x240.ogg', + $base_root . $base_path . 'foo1/test.png', + $base_root . $base_path . $folder1 . '/test.png', + $base_root . $base_path . 'foo1/bar1', + $base_root . $base_path . $folder1 . '/foo2/bar2', + $base_root . $base_path . 'foo4/foo5', + $base_root . $base_path . $folder1 . '/foo5/foo6', + $base_root . $base_path . $folder1 . '/foo4/foo5/foo6', + $base_root . $base_path . $folder1 . '/test/foo bar/is_valid-hack.test', + $base_root . $base_path . $folder1 . '/flash.png', + $base_root . $base_path . $folder1 . '/ritmo.mid', + $base_root . $base_path . $folder1 . '/my_ogg_video.ogg', + $base_root . $base_path . $folder1 . '/video.ogv', + $base_root . $base_path . $folder1 . '/flvplayer1.swf', + $base_root . $base_path . $folder1 . '/flvplayer2.swf', + $base_root . $base_path . $folder1 . '/foo.ogg', + ); + + foreach ($urls as $url) { + $this->assertTrue($this->getLinkcheckerLink($url)->status, format_string('Link check for %url is enabled.', array('%url' => $url))); + } + + // Verify if link check has been disabled for example.com/net/org URLs. + $documentation_urls = array( + 'http://example.net/video/foo1.mov', + 'http://example.net/video/foo2.mov', + 'http://example.net/video/foo3.mov', + 'http://example.org/video/foo1.mp4', + 'http://example.org/video/foo2.mp4', + 'http://example.org/video/foo3.mp4', + 'http://example.org/video/foo4.mp4', + 'http://example.org/video/foo5.mp4', + 'http://example.org/video/foo6.mp4', + 'http://example.org/video/player1.swf', + 'http://example.org/video/player2.swf', + 'http://example.org/video/player3.swf', + 'http://example.com/iframe/', + 'http://example.com/foo bar/is_valid-hack.test', + 'http://example.com/ajax.html#key1=value1&key2=value2', + 'http://example.com/test.html#test', + ); + + foreach ($documentation_urls as $documentation_url) { + $this->assertFalse($this->getLinkcheckerLink($documentation_url)->status, format_string('Link check for %url is disabled.', array('%url' => $documentation_url))); + } + + } + + /** + * Get linkchecker link by url. + * + * @param string $url + * URL of the link to find. + * + * @return object + * The link object. + */ + function getLinkCheckerLink($url) { + return db_query('SELECT * FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => drupal_hash_base64($url)))->fetchObject(); + } + + /** + * Get the current number of links in linkchecker_links table. + */ + function getLinkCheckerLinksCount() { + return db_query('SELECT COUNT(1) FROM {linkchecker_link}')->fetchField(); + } +} + + +class LinkCheckerInterfaceTest extends DrupalWebTestCase { + + public static function getInfo() { + return array( + 'name' => 'Link checker interface tests', + 'description' => 'Test the interface functionality.', + 'group' => 'Link checker', + ); + } + + public function setUp() { + parent::setUp('block', 'linkchecker', 'path'); + // @todo: Add comment interface test. + // parent::setUp('block', 'comment', 'linkchecker', 'path'); + + $full_html_format = filter_format_load('full_html'); + $permissions = array( + // Block permissions. + 'administer blocks', + // Comment permissions. + 'administer comments', + 'access comments', + 'post comments', + 'skip comment approval', + 'edit own comments', + // Node permissions. + 'create page content', + 'edit own page content', + // Path aliase permissions. + 'administer url aliases', + 'create url aliases', + // Content filter permissions. + filter_permission_name($full_html_format), + ); + + $user = $this->drupalCreateUser($permissions); + $this->drupalLogin($user); + + } + + public function testLinkCheckerCreateNodeWithBrokenLinks() { + // Enable all node type page for link extraction. + variable_set('linkchecker_scan_node_page', TRUE); + + // Core enables the URL filter for "Full HTML" by default. + // -> Blacklist / Disable URL filter for testing. + variable_set('linkchecker_filter_blacklist', array('filter_url' => 'filter_url')); + + // Extract from all link checker supported HTML tags. + variable_set('linkchecker_extract_from_a', 1); + variable_set('linkchecker_extract_from_audio', 1); + variable_set('linkchecker_extract_from_embed', 1); + variable_set('linkchecker_extract_from_iframe', 1); + variable_set('linkchecker_extract_from_img', 1); + variable_set('linkchecker_extract_from_object', 1); + variable_set('linkchecker_extract_from_video', 1); + + $url1 = 'http://example.com/node/broken/link'; + $body = 'Lorem ipsum dolor sit amet <a href="' . $url1 . '">broken link</a> sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat'; + + // Save folder names in variables for reuse. + $folder1 = $this->randomName(10); + $folder2 = $this->randomName(5); + + // Fill node array. + $langcode = LANGUAGE_NONE; + $edit = array(); + $edit['title'] = $this->randomName(32); + $edit["body[$langcode][0][value]"] = $body; + $edit['path[alias]'] = $folder1 . '/' . $folder2; + $edit["body[$langcode][0][format]"] = 'full_html'; + + // Extract only full qualified URLs. + variable_set('linkchecker_check_links_types', 1); + + // Verify path input field appears on add "Basic page" form. + $this->drupalGet('node/add/page'); + // Verify path input is present. + $this->assertFieldByName('path[alias]', '', 'Path input field present on add Basic page form.'); + + // Save node. + $this->drupalPost('node/add/page', $edit, t('Save')); + $this->assertText(t('@type @title has been created.', array('@type' => 'Basic page', '@title' => $edit['title'])), 'Node was created.'); + + $node = $this->drupalGetNodeByTitle($edit['title']); + $this->assertTrue($node, 'Node found in database.'); + + // Verify if the content link is extracted properly. + $link = $this->getLinkCheckerLink($url1); + if ($link) { + $this->assertIdentical($link->url, $url1, format_string('URL %url found.', array('%url' => $url1))); + } + else { + $this->fail(format_string('URL %url not found.', array('%url' => $url1))); + } + + // Set link as failed once. + $fail_count = 1; + $status = '301'; + $this->setLinkAsBroken($url1, $status, $fail_count); + $this->drupalGet('node/' . $node->nid . '/edit'); + $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), 'Link check failed once found.'); + + // Set link as failed multiple times. + $fail_count = 4; + $status = '404'; + $this->setLinkAsBroken($url1, $status, $fail_count); + $this->drupalGet('node/' . $node->nid . '/edit'); + $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), 'Link check failed multiple times found.'); + } + + public function testLinkCheckerCreateBlockWithBrokenLinks() { + // Enable all blocks for link extraction. + variable_set('linkchecker_scan_blocks', 1); + + // Confirm that the add block link appears on block overview pages. + $this->drupalGet('admin/structure/block'); + $this->assertRaw(l(t('Add block'), 'admin/structure/block/add'), 'Add block link is present on block overview page for default theme.'); + + $url1 = 'http://example.com/block/broken/link'; + $body = 'Lorem ipsum dolor sit amet <a href="' . $url1 . '">broken link</a> sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat'; + + // Add a new custom block by filling out the input form on the admin/structure/block/add page. + $custom_block = array(); + $custom_block['info'] = $this->randomName(8); + $custom_block['title'] = $this->randomName(8); + $custom_block['body[value]'] = $body; + $custom_block['body[format]'] = 'full_html'; + $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block')); + + // Confirm that the custom block has been created, and then query the created bid. + $this->assertText(t('The block has been created.'), 'Custom block successfully created.'); + $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField(); + + // Check to see if the custom block was created by checking that it's in the database. + $this->assertNotNull($bid, 'Custom block found in database'); + + // Verify if the content link is extracted properly. + $link = $this->getLinkCheckerLink($url1); + if ($link) { + $this->assertIdentical($link->url, $url1, format_string('URL %url found.', array('%url' => $url1))); + } + else { + $this->fail(format_string('URL %url not found.', array('%url' => $url1))); + } + + // Set link as failed once. + $fail_count = 1; + $status = '301'; + $this->setLinkAsBroken($url1, $status, $fail_count); + $this->drupalGet('admin/structure/block/manage/block/' . $bid . '/configure'); + $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), 'Link check failed once found.'); + + // Set link as failed multiple times. + $fail_count = 4; + $status = '404'; + $this->setLinkAsBroken($url1, $status, $fail_count); + $this->drupalGet('admin/structure/block/manage/block/' . $bid . '/configure'); + $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), 'Link check failed multiple times found.'); + } + + /** + * Set an URL as broken. + * + * @param string $url + * URL of the link to find. + * @param string $status + * A fake HTTP code for testing. + */ + function setLinkAsBroken($url = NULL, $status = '404', $fail_count = 0) { + db_update('linkchecker_link') + ->condition('urlhash', drupal_hash_base64($url)) + ->fields(array( + 'code' => $status, + 'error' => 'Not available (test running)', + 'fail_count' => $fail_count, + 'last_checked' => time(), + 'status' => 1, + )) + ->execute(); + } + + /** + * Get linkchecker link by url. + * + * @param string $url + * URL of the link to find. + * + * @return object + * The link object. + */ + function getLinkCheckerLink($url) { + return db_query('SELECT * FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => drupal_hash_base64($url)))->fetchObject(); + } +} + +/** + * Test case for impersonating users. + * + * Based on http://drupal.org/node/287292#comment-3162350 + */ +class LinkCheckerImpersonatingUserTestCase extends DrupalWebTestCase { + + public static function getInfo() { + return array( + 'name' => 'Link checker impersonate users', + 'description' => 'Temporarily impersonate another user, and then restore the original user.', + 'group' => 'Link checker', + ); + } + + function setUp() { + parent::setUp('linkchecker'); + } + + function testLinkCheckerImpersonateUser() { + global $user; + $original_user = $user; + + // If not currently logged in, use linkchecker_impersonate_user() to switch to + // user 1. If logged in, switch to the anonymous user instead. + if (user_is_anonymous()) { + linkchecker_impersonate_user(1); + } + else { + linkchecker_impersonate_user(0); + } + + // Verify that the active user has changed, and that session saving is + // disabled. + $this->assertEqual($user->uid, ($original_user->uid == 0 ? 1 : 0), 'User switched'); + $this->assertFalse(drupal_save_session(), 'Session saving is disabled.'); + + // Perform a second (nested) impersonation. + linkchecker_impersonate_user(1); + $this->assertEqual($user->uid, 1, 'User switched.'); + + // Revert to the user which was active between the first and second + // impersonation attempt. + linkchecker_revert_user(); + + // Since we are still impersonating the user from the first attempt, + // session handling still needs to be disabled. + $this->assertEqual($user->uid, ($original_user->uid == 0 ? 1 : 0), 'User switched.'); + $this->assertFalse(drupal_save_session(), 'Session saving is disabled.'); + + // Revert to the original user which was active before the first + // impersonation attempt. + linkchecker_revert_user(); + + // Assert that the original user is the active user again, and that session + // saving has been re-enabled. + $this->assertEqual($user->uid, $original_user->uid, 'Original user successfully restored.'); + + // Simpletest uses linkchecker_impersonate_user() too, revert the impersonation by + // Simpletest to enable session saving again. This is safe because calling + // linkchecker_revert_user() too often simply results in returning the active user. + linkchecker_revert_user(); + $this->assertTrue(drupal_save_session(), 'Session saving is enabled.'); + } +} diff --git a/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc new file mode 100644 index 000000000..591ecf583 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc @@ -0,0 +1,97 @@ +<?php + +/** + * @file + * Definition of linkchecker_handler_field_linkchecker_block_custom_block_edit. + */ + +/** + * Field handler to present a block edit link. + * + * @ingroup views_field_handlers + */ +class linkchecker_handler_field_linkchecker_block_custom_block_edit extends views_handler_field { + + /** + * {@inheritdoc} + */ + function construct() { + parent::construct(); + + $this->additional_fields['bid'] = 'bid'; + } + + /** + * {@inheritdoc} + */ + function option_definition() { + $options = parent::option_definition(); + + $options['destination'] = array('default' => TRUE, 'bool' => TRUE); + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + /** + * {@inheritdoc} + */ + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + + parent::options_form($form, $form_state); + + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + + // The path is set by render_link function so don't allow to set it. + $form['alter']['path'] = array('#access' => FALSE); + $form['alter']['external'] = array('#access' => FALSE); + } + + /** + * {@inheritdoc} + */ + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($bid = $this->get_value($values, 'bid')) { + return $this->render_link($bid); + } + } + + /** + * Renders the link. + */ + function render_link($bid) { + if (user_access('administer blocks')) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'admin/structure/block/manage/block/' . $bid . '/configure'; + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('Edit block'); + + return $text; + } + } + +} diff --git a/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc new file mode 100644 index 000000000..5aa5f10aa --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc @@ -0,0 +1,97 @@ +<?php + +/** + * @file + * Definition of linkchecker_handler_field_linkchecker_link_link_edit. + */ + +/** + * Field handler to present a linkchecker edit link. + * + * @ingroup views_field_handlers + */ +class linkchecker_handler_field_linkchecker_link_link_edit extends views_handler_field { + + /** + * {@inheritdoc} + */ + function construct() { + parent::construct(); + + $this->additional_fields['lid'] = 'lid'; + } + + /** + * {@inheritdoc} + */ + function option_definition() { + $options = parent::option_definition(); + + $options['destination'] = array('default' => TRUE, 'bool' => TRUE); + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + /** + * {@inheritdoc} + */ + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + + parent::options_form($form, $form_state); + + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + + // The path is set by render_link function so don't allow to set it. + $form['alter']['path'] = array('#access' => FALSE); + $form['alter']['external'] = array('#access' => FALSE); + } + + /** + * {@inheritdoc} + */ + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($lid = $this->get_value($values, 'lid')) { + return $this->render_link($lid); + } + } + + /** + * Renders the link. + */ + function render_link($lid) { + if (_linkchecker_access_edit_link_settings(array('lid' => $lid))) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'linkchecker/' . $lid . '/edit'; + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('Edit link settings'); + + return $text; + } + } + +} diff --git a/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc new file mode 100644 index 000000000..cf23df95b --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc @@ -0,0 +1,100 @@ +<?php + +/** + * @file + * Definition of linkchecker_handler_field_linkchecker_link_redirect_add. + */ + +/** + * Field handler to present an add redirect link. + * + * @ingroup views_field_handlers + */ +class linkchecker_handler_field_linkchecker_link_redirect_add extends views_handler_field { + + /** + * {@inheritdoc} + */ + function construct() { + parent::construct(); + + $this->additional_fields['lid'] = 'lid'; + $this->additional_fields['url'] = 'url'; + } + + /** + * {@inheritdoc} + */ + function option_definition() { + $options = parent::option_definition(); + + $options['destination'] = array('default' => TRUE, 'bool' => TRUE); + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + /** + * {@inheritdoc} + */ + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + + parent::options_form($form, $form_state); + + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + + // The path is set by render_link function so don't allow to set it. + $form['alter']['path'] = array('#access' => FALSE); + $form['alter']['external'] = array('#access' => FALSE); + } + + /** + * {@inheritdoc} + */ + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if (($lid = $this->get_value($values, 'lid')) && ($url = $this->get_value($values, 'url'))) { + $link = (object) array('lid' => $lid, 'url' => $url); + return $this->render_link($link); + } + } + + /** + * Renders the link. + */ + function render_link($link) { + if (user_access('administer redirects') && _linkchecker_is_internal_url($link)) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'admin/config/search/redirect/add'; + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $this->options['alter']['query']['source'] = $link->url; + $text = !empty($this->options['text']) ? $this->options['text'] : t('Create redirect'); + + return $text; + } + } + +} diff --git a/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc new file mode 100644 index 000000000..6ad66b3cc --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc @@ -0,0 +1,49 @@ +<?php + +/** + * @file + * Definition of linkchecker_handler_field_linkchecker_link_url. + */ + +/** + * Field handler to present a linkchecker url. + * + * @ingroup views_field_handlers + */ +class linkchecker_handler_field_linkchecker_link_url extends views_handler_field { + + /** + * {@inheritdoc} + */ + function construct() { + parent::construct(); + + $this->additional_fields['lid'] = 'lid'; + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($lid = $this->get_value($values, 'lid') && $url = $this->get_value($values)) { + $link = (object) array('lid' => $lid, 'url' => $url); + return $this->render_link($link); + } + } + + /** + * Renders the link. + */ + function render_link($link) { + if (user_access('access broken links report') || _linkchecker_link_access($link)) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = $link->url; + return $link->url; + } + else { + return t('Permission restrictions deny you access to this broken link.'); + } + } + +} diff --git a/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc new file mode 100644 index 000000000..e2f79a52b --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc @@ -0,0 +1,26 @@ +<?php + +/** + * @file + * Definition of linkchecker_handler_filter_linkchecker_link_code. + */ + +/** + * Filter by http status code. + * + * @ingroup views_filter_handlers + */ +class linkchecker_handler_filter_linkchecker_link_code extends views_handler_filter_in_operator { + + /** + * {@inheritdoc} + */ + function get_value_options() { + if (isset($this->value_options)) { + return; + } + + $this->value_options = _linkchecker_response_codes(); + } + +} diff --git a/dkan/modules/contrib/linkchecker/views/linkchecker.views.inc b/dkan/modules/contrib/linkchecker/views/linkchecker.views.inc new file mode 100644 index 000000000..e4c0179b3 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/linkchecker.views.inc @@ -0,0 +1,307 @@ +<?php + +/** + * @file + * Views callbacks for the linkchecker module. + */ + +/** + * Implements hook_views_data(). + */ +function linkchecker_views_data() { + $data['linkchecker_link'] = array( + 'table' => array( + 'group' => t('Broken links'), + // Define this as a base table. + 'base' => array( + 'field' => 'lid', + 'title' => t('Broken links'), + 'help' => t('Broken links related to nodes, blocks, comments, fields, etc.'), + ), + // Define joins. + 'join' => array( + 'linkchecker_block_custom' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'linkchecker_comment' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'linkchecker_node' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t("The unique linkchecker link ID."), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ), + 'url' => array( + 'title' => t('URL'), + 'help' => t('The URL of a link in a broken links report.'), + 'field' => array( + 'handler' => 'linkchecker_handler_field_linkchecker_link_url', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ), + // HTTP status code. + 'code' => array( + 'title' => t('HTTP status code'), + 'help' => t('The status code returned by HTTP requests to the link.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'linkchecker_handler_filter_linkchecker_link_code', + ), + ), + // Error message. + 'error' => array( + 'title' => t('Error message'), + 'help' => t('The error message received from the remote server while doing link checking.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ), + // Fail count. + 'fail_count' => array( + 'title' => t('Fail count'), + 'help' => t('The number of times a request for the URL has failed.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ), + // Last checked unix timestamp. + 'last_checked' => array( + 'title' => t('Last checked'), + 'help' => t('Unix timestamp of the last link check.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ), + // Status (TRUE|FALSE if the link check is enabled|disabled). + 'status' => array( + 'title' => t('Status'), + 'help' => t('Whether or not the link should be checked for being broken.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Check link status'), + 'type' => 'enabled-disabled', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ), + // Link to edit the link settings. + 'link_edit' => array( + 'field' => array( + 'title' => t('Edit link settings'), + 'help' => t('Provide a simple link to edit the link settings.'), + 'handler' => 'linkchecker_handler_field_linkchecker_link_link_edit', + ), + ), + ); + + $data['linkchecker_node'] = array( + 'table' => array( + 'group' => t('Broken links'), + 'join' => array( + 'linkchecker_link' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'node' => array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t("The unique linkchecker link ID."), + ), + 'nid' => array( + 'title' => t('Content with link'), + 'help' => t('Relate all content associted with a link.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'node', + 'base field' => 'nid', + 'label' => t('Node'), + 'skip base' => 'node', + ), + ), + ); + + if (module_exists('comment')) { + $data['linkchecker_comment'] = array( + 'table' => array( + 'group' => t('Broken links'), + 'join' => array( + 'linkchecker_link' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'comment' => array( + 'left_field' => 'cid', + 'field' => 'cid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t("The unique linkchecker link ID."), + ), + 'cid' => array( + 'title' => t('Comment with link'), + 'help' => t('Relate all comments associted with a link.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'comment', + 'base field' => 'cid', + 'label' => t('Comment'), + 'skip base' => 'comment', + ), + ), + ); + } + + if (module_exists('block')) { + $data['linkchecker_block_custom'] = array( + 'table' => array( + 'group' => t('Broken links'), + 'join' => array( + 'linkchecker_link' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t('The unique linkchecker link ID.'), + ), + 'bid' => array( + 'title' => t('Block ID'), + 'help' => t('The unique block ID.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ), + // Link to edit the block. + 'block_edit' => array( + 'field' => array( + 'title' => t('Edit block'), + 'help' => t('Provide a simple link to edit the block.'), + 'handler' => 'linkchecker_handler_field_linkchecker_block_custom_block_edit', + ), + ), + ); + } + + // Add a 'Redirect add' link if the Redirect module is installed. + if (module_exists('redirect')) { + $data['linkchecker_link']['redirect_add'] = array( + 'field' => array( + 'title' => t('Create redirect'), + 'help' => t('Provide a simple link to create a redirect.'), + 'handler' => 'linkchecker_handler_field_linkchecker_link_redirect_add', + ), + ); + } + + return $data; +} + +/** + * Implements hook_views_plugins(). + */ +function linkchecker_views_plugins() { + return array( + 'access' => array( + 'linkchecker' => array( + 'title' => t('Linkchecker'), + 'handler' => 'linkchecker_plugin_access', + ), + ), + ); +} + +/** + * Implements hook_views_pre_render(). + */ +function linkchecker_views_pre_render(&$view) { + // If the view's base table is linkchecker_link and it's a page display. + if ($view->base_table == 'linkchecker_link' && $view->display[$view->current_display]->display_plugin == 'page') { + // Set a status message if any unchecked links exist. + $links_unchecked = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE last_checked = :last_checked AND status = :status', array(':last_checked' => 0, ':status' => 1))->fetchField(); + if ($links_unchecked > 0) { + $links_all = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE status = :status', array(':status' => 1))->fetchField(); + drupal_set_message(format_plural($links_unchecked, + 'There is 1 unchecked link of about @links_all links in the database. Please be patient until all links have been checked via cron.', + 'There are @count unchecked links of about @links_all links in the database. Please be patient until all links have been checked via cron.', + array('@links_all' => $links_all)), 'warning'); + } + } +} diff --git a/dkan/modules/contrib/linkchecker/views/linkchecker.views_default.inc b/dkan/modules/contrib/linkchecker/views/linkchecker.views_default.inc new file mode 100644 index 000000000..3c0afdc71 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/linkchecker.views_default.inc @@ -0,0 +1,487 @@ +<?php + +/** + * @file + * Default views for the Linkchecker module. + */ + +/** + * Implements hook_views_default_views(). + */ +function linkchecker_views_default_views() { + $export = array(); + + $comment = module_exists('comment'); + $block = module_exists('block'); + $redirect = module_exists('redirect'); + + $view = new view(); + $view->name = 'linkchecker_reports'; + $view->description = 'Display a list of broken links.'; + $view->tag = 'default'; + $view->base_table = 'linkchecker_link'; + $view->human_name = 'Advanced Broken links'; + $view->core = 0; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Defaults */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->display->display_options['title'] = 'Advanced Broken links'; + $handler->display->display_options['items_per_page'] = 0; + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'linkchecker'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['query']['options']['query_comment'] = FALSE; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['exposed_form']['options']['reset_button'] = TRUE; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = '50'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['style_plugin'] = 'table'; + $handler->display->display_options['style_options']['columns'] = array( + 'url' => 'url', + 'code' => 'code', + 'error' => 'error', + 'link_edit' => 'link_edit', + 'nid' => 'nid', + 'edit_node' => 'edit_node', + ); + if ($comment) { + $handler->display->display_options['style_options']['columns'] += array( + 'cid' => 'cid', + 'edit_comment' => 'edit_comment', + ); + } + if ($block) { + $handler->display->display_options['style_options']['columns'] += array( + 'bid' => 'bid', + 'block_edit' => 'block_edit', + ); + } + if ($redirect) { + $handler->display->display_options['style_options']['columns'] += array( + 'redirect_add' => 'redirect_add', + ); + } + $handler->display->display_options['style_options']['columns'] += array( + 'nothing' => 'nothing', + ); + $handler->display->display_options['style_options']['default'] = 'url'; + $handler->display->display_options['style_options']['info'] = array( + 'url' => array( + 'sortable' => 1, + 'default_sort_order' => 'desc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'code' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'error' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'link_edit' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'nid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'edit_node' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + if ($comment) { + $handler->display->display_options['style_options']['info'] += array( + 'cid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'edit_comment' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + } + if ($block) { + $handler->display->display_options['style_options']['info'] += array( + 'bid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'block_edit' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + } + if ($redirect) { + $handler->display->display_options['style_options']['info'] += array( + 'redirect_add' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + } + $handler->display->display_options['style_options']['info'] += array( + 'nothing' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + $handler->display->display_options['style_options']['sticky'] = TRUE; + $handler->display->display_options['style_options']['empty_table'] = TRUE; + /* No results behavior: Global: Text area */ + $handler->display->display_options['empty']['area']['id'] = 'area'; + $handler->display->display_options['empty']['area']['table'] = 'views'; + $handler->display->display_options['empty']['area']['field'] = 'area'; + $handler->display->display_options['empty']['area']['empty'] = TRUE; + $handler->display->display_options['empty']['area']['content'] = 'No broken links have been found.'; + $handler->display->display_options['empty']['area']['format'] = 'plain_text'; + /* Relationship: Broken links: Content with link */ + $handler->display->display_options['relationships']['nid']['id'] = 'nid'; + $handler->display->display_options['relationships']['nid']['table'] = 'linkchecker_node'; + $handler->display->display_options['relationships']['nid']['field'] = 'nid'; + if ($comment) { + /* Relationship: Broken links: Comment with link */ + $handler->display->display_options['relationships']['cid']['id'] = 'cid'; + $handler->display->display_options['relationships']['cid']['table'] = 'linkchecker_comment'; + $handler->display->display_options['relationships']['cid']['field'] = 'cid'; + } + /* Field: Broken links: URL */ + $handler->display->display_options['fields']['url']['id'] = 'url'; + $handler->display->display_options['fields']['url']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['url']['field'] = 'url'; + $handler->display->display_options['fields']['url']['alter']['max_length'] = '40'; + $handler->display->display_options['fields']['url']['alter']['word_boundary'] = FALSE; + $handler->display->display_options['fields']['url']['alter']['trim'] = TRUE; + $handler->display->display_options['fields']['url']['hide_empty'] = TRUE; + /* Field: Broken links: HTTP status code */ + $handler->display->display_options['fields']['code']['id'] = 'code'; + $handler->display->display_options['fields']['code']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['code']['field'] = 'code'; + $handler->display->display_options['fields']['code']['label'] = 'Response'; + $handler->display->display_options['fields']['code']['separator'] = ''; + /* Field: Broken links: Error message */ + $handler->display->display_options['fields']['error']['id'] = 'error'; + $handler->display->display_options['fields']['error']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['error']['field'] = 'error'; + $handler->display->display_options['fields']['error']['label'] = 'Error'; + /* Field: Broken links: Edit link settings */ + $handler->display->display_options['fields']['link_edit']['id'] = 'link_edit'; + $handler->display->display_options['fields']['link_edit']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['link_edit']['field'] = 'link_edit'; + $handler->display->display_options['fields']['link_edit']['exclude'] = TRUE; + $handler->display->display_options['fields']['link_edit']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['link_edit']['alter']['text'] = '<li>Edit link settings</li>'; + $handler->display->display_options['fields']['link_edit']['hide_empty'] = TRUE; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['relationship'] = 'nid'; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; + /* Field: Content: Edit link */ + $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node'; + $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['relationship'] = 'nid'; + $handler->display->display_options['fields']['edit_node']['label'] = 'Edit node'; + $handler->display->display_options['fields']['edit_node']['exclude'] = TRUE; + $handler->display->display_options['fields']['edit_node']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['edit_node']['alter']['text'] = '<li>Edit node [nid]</li>'; + $handler->display->display_options['fields']['edit_node']['hide_empty'] = TRUE; + if ($comment) { + /* Field: Comment: ID */ + $handler->display->display_options['fields']['cid']['id'] = 'cid'; + $handler->display->display_options['fields']['cid']['table'] = 'comment'; + $handler->display->display_options['fields']['cid']['field'] = 'cid'; + $handler->display->display_options['fields']['cid']['relationship'] = 'cid'; + $handler->display->display_options['fields']['cid']['exclude'] = TRUE; + $handler->display->display_options['fields']['cid']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['cid']['alter']['text'] = '<li>Edit comment [cid]</li>'; + $handler->display->display_options['fields']['cid']['alter']['make_link'] = TRUE; + $handler->display->display_options['fields']['cid']['alter']['path'] = 'comment/[cid]/edit'; + $handler->display->display_options['fields']['cid']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['cid']['link_to_comment'] = FALSE; + } + if ($block) { + /* Field: Broken links: Block ID */ + $handler->display->display_options['fields']['bid']['id'] = 'bid'; + $handler->display->display_options['fields']['bid']['table'] = 'linkchecker_block_custom'; + $handler->display->display_options['fields']['bid']['field'] = 'bid'; + $handler->display->display_options['fields']['bid']['exclude'] = TRUE; + $handler->display->display_options['fields']['bid']['separator'] = ''; + /* Field: Broken links: Edit block */ + $handler->display->display_options['fields']['block_edit']['id'] = 'block_edit'; + $handler->display->display_options['fields']['block_edit']['table'] = 'linkchecker_block_custom'; + $handler->display->display_options['fields']['block_edit']['field'] = 'block_edit'; + $handler->display->display_options['fields']['block_edit']['exclude'] = TRUE; + $handler->display->display_options['fields']['block_edit']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['block_edit']['alter']['text'] = '<li>Edit block [bid]</li>'; + $handler->display->display_options['fields']['block_edit']['hide_empty'] = TRUE; + } + if ($redirect) { + /* Field: Broken links: Create redirect */ + $handler->display->display_options['fields']['redirect_add']['id'] = 'redirect_add'; + $handler->display->display_options['fields']['redirect_add']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['redirect_add']['field'] = 'redirect_add'; + $handler->display->display_options['fields']['redirect_add']['exclude'] = TRUE; + $handler->display->display_options['fields']['redirect_add']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['redirect_add']['alter']['text'] = '<li>Create redirect</li>'; + $handler->display->display_options['fields']['redirect_add']['hide_empty'] = TRUE; + } + /* Field: Global: Custom text */ + $handler->display->display_options['fields']['nothing']['id'] = 'nothing'; + $handler->display->display_options['fields']['nothing']['table'] = 'views'; + $handler->display->display_options['fields']['nothing']['field'] = 'nothing'; + $handler->display->display_options['fields']['nothing']['label'] = 'Operations'; + $handler->display->display_options['fields']['nothing']['alter']['text'] = '<ul> + [link_edit] + [edit_node]'; + $handler->display->display_options['fields']['nothing']['alter']['text'] .= $comment ? "\n [cid]" : ''; + $handler->display->display_options['fields']['nothing']['alter']['text'] .= $block ? "\n [block_edit]" : '' ; + $handler->display->display_options['fields']['nothing']['alter']['text'] .= $redirect ? "\n [redirect_add]" : ''; + $handler->display->display_options['fields']['nothing']['alter']['text'] .= "\n</ul>"; + $nothing_translatable = $handler->display->display_options['fields']['nothing']['alter']['text']; + $handler->display->display_options['fields']['nothing']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = TRUE; + /* Sort criterion: Broken links: Last checked */ + $handler->display->display_options['sorts']['last_checked']['id'] = 'last_checked'; + $handler->display->display_options['sorts']['last_checked']['table'] = 'linkchecker_link'; + $handler->display->display_options['sorts']['last_checked']['field'] = 'last_checked'; + $handler->display->display_options['sorts']['last_checked']['order'] = 'DESC'; + /* Filter criterion: Broken links: Last checked */ + $handler->display->display_options['filters']['last_checked']['id'] = 'last_checked'; + $handler->display->display_options['filters']['last_checked']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['last_checked']['field'] = 'last_checked'; + $handler->display->display_options['filters']['last_checked']['operator'] = '!='; + $handler->display->display_options['filters']['last_checked']['value']['value'] = '0'; + $handler->display->display_options['filters']['last_checked']['group'] = 1; + /* Filter criterion: Broken links: Status */ + $handler->display->display_options['filters']['status']['id'] = 'status'; + $handler->display->display_options['filters']['status']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['status']['field'] = 'status'; + $handler->display->display_options['filters']['status']['value'] = '1'; + $handler->display->display_options['filters']['status']['group'] = 1; + /* Filter criterion: Broken links: URL */ + $handler->display->display_options['filters']['url']['id'] = 'url'; + $handler->display->display_options['filters']['url']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['url']['field'] = 'url'; + $handler->display->display_options['filters']['url']['operator'] = 'contains'; + $handler->display->display_options['filters']['url']['group'] = 1; + $handler->display->display_options['filters']['url']['exposed'] = TRUE; + $handler->display->display_options['filters']['url']['expose']['operator_id'] = 'url_op'; + $handler->display->display_options['filters']['url']['expose']['label'] = 'URL'; + $handler->display->display_options['filters']['url']['expose']['operator'] = 'url_op'; + $handler->display->display_options['filters']['url']['expose']['identifier'] = 'url'; + $handler->display->display_options['filters']['url']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 7 => 0, + 6 => 0, + 5 => 0, + 10 => 0, + 9 => 0, + 11 => 0, + 14 => 0, + 13 => 0, + 15 => 0, + ); + $handler->display->display_options['filters']['url']['expose']['autocomplete_items'] = '10'; + $handler->display->display_options['filters']['url']['expose']['autocomplete_field'] = 'url'; + $handler->display->display_options['filters']['url']['expose']['autocomplete_raw_suggestion'] = 1; + $handler->display->display_options['filters']['url']['expose']['autocomplete_raw_dropdown'] = 1; + $handler->display->display_options['filters']['url']['expose']['autocomplete_dependent'] = 0; + /* Filter criterion: Broken links: HTTP status code */ + $handler->display->display_options['filters']['code']['id'] = 'code'; + $handler->display->display_options['filters']['code']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['code']['field'] = 'code'; + $handler->display->display_options['filters']['code']['value'] = array( + 100 => '100', + 101 => '101', + 201 => '201', + 202 => '202', + 203 => '203', + 204 => '204', + 205 => '205', + 206 => '206', + 300 => '300', + 301 => '301', + 302 => '302', + 303 => '303', + 304 => '304', + 305 => '305', + 307 => '307', + 400 => '400', + 401 => '401', + 402 => '402', + 403 => '403', + 404 => '404', + 405 => '405', + 406 => '406', + 407 => '407', + 408 => '408', + 409 => '409', + 410 => '410', + 411 => '411', + 412 => '412', + 413 => '413', + 414 => '414', + 415 => '415', + 416 => '416', + 417 => '417', + 500 => '500', + 501 => '501', + 502 => '502', + 503 => '503', + 504 => '504', + 505 => '505', + -10053 => '-10053', + -11001 => '-11001', + ); + $handler->display->display_options['filters']['code']['group'] = 1; + $handler->display->display_options['filters']['code']['exposed'] = TRUE; + $handler->display->display_options['filters']['code']['expose']['operator_id'] = 'code_op'; + $handler->display->display_options['filters']['code']['expose']['label'] = 'HTTP status code'; + $handler->display->display_options['filters']['code']['expose']['operator'] = 'code_op'; + $handler->display->display_options['filters']['code']['expose']['identifier'] = 'code'; + $handler->display->display_options['filters']['code']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + ); + $handler->display->display_options['filters']['code']['expose']['reduce'] = TRUE; + /* Filter criterion: Broken links: Error message */ + $handler->display->display_options['filters']['error']['id'] = 'error'; + $handler->display->display_options['filters']['error']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['error']['field'] = 'error'; + $handler->display->display_options['filters']['error']['operator'] = 'contains'; + $handler->display->display_options['filters']['error']['exposed'] = TRUE; + $handler->display->display_options['filters']['error']['expose']['operator_id'] = 'error_op'; + $handler->display->display_options['filters']['error']['expose']['label'] = 'Error message'; + $handler->display->display_options['filters']['error']['expose']['operator'] = 'error_op'; + $handler->display->display_options['filters']['error']['expose']['identifier'] = 'error'; + $handler->display->display_options['filters']['error']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + ); + + /* Display: Admin Broken links */ + $handler = $view->new_display('page', 'Admin Broken links', 'linkchecker_admin_report_page'); + $handler->display->display_options['display_description'] = 'Shows a list of broken links in content, with advanced filters.'; + $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; + $handler->display->display_options['path'] = 'admin/reports/linkchecker_adv'; + $handler->display->display_options['menu']['type'] = 'normal'; + $handler->display->display_options['menu']['title'] = 'Advanced Broken links'; + $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in content, with advanced filters.'; + $handler->display->display_options['menu']['weight'] = '2'; + $handler->display->display_options['menu']['name'] = 'management'; + $handler->display->display_options['menu']['context'] = 0; + $handler->display->display_options['menu']['context_only_inline'] = 0; + + /* Display: User Broken links */ + $handler = $view->new_display('page', 'User Broken links', 'linkchecker_user_report_page'); + $handler->display->display_options['display_description'] = 'Shows a list of broken links in authors content, with advanced filters.'; + $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; + $handler->display->display_options['defaults']['arguments'] = FALSE; + $handler->display->display_options['path'] = 'user/%user/linkchecker_adv'; + $handler->display->display_options['menu']['type'] = 'tab'; + $handler->display->display_options['menu']['title'] = 'Advanced Broken links'; + $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in authors content, with advanced filters.'; + $handler->display->display_options['menu']['weight'] = '4'; + $handler->display->display_options['menu']['name'] = 'user-menu'; + $handler->display->display_options['menu']['context'] = 0; + + $translatables['linkchecker_reports'] = array( + t('Defaults'), + t('Advanced Broken links'), + t('more'), + t('Apply'), + t('Reset'), + t('Sort by'), + t('Asc'), + t('Desc'), + t('Items per page'), + t('- All -'), + t('Offset'), + t('« first'), + t('‹ previous'), + t('next ›'), + t('last »'), + t('No broken links have been found.'), + t('Node'), + t('URL'), + t('Response'), + t('.'), + t('Error'), + t('Edit link settings'), + t('<li>Edit link settings</li>'), + t('Nid'), + t('Edit node'), + t('<li>Edit node [nid]</li>'), + t('Operations'), + t($nothing_translatable), + t('Admin Broken links'), + t('Shows a list of broken links in content.'), + t('User Broken links'), + t('Shows a list of broken links in authors content.'), + ); + + if ($comment) { + $translatables['linkchecker_reports'] += array( + t('Comment'), + t('ID'), + t('Edit link'), + t('<li>Edit comment [cid]</li>'), + ); + } + if ($block) { + $translatables['linkchecker_reports'] += array( + t('Block ID'), + t('Edit block'), + t('<li>Edit block [bid]</li>'), + ); + } + if ($redirect) { + $translatables['linkchecker_reports'] += array( + t('Create redirect'), + t('<li>Create redirect</li>'), + ); + } + + $export['linkchecker_reports'] = $view; + + return $export; +} diff --git a/dkan/modules/contrib/linkchecker/views/plugins/linkchecker_plugin_access.inc b/dkan/modules/contrib/linkchecker/views/plugins/linkchecker_plugin_access.inc new file mode 100644 index 000000000..8cc48da69 --- /dev/null +++ b/dkan/modules/contrib/linkchecker/views/plugins/linkchecker_plugin_access.inc @@ -0,0 +1,36 @@ +<?php + +/** + * @file + * Definition of linkchecker_plugin_access. + */ + +/** + * Access plugin for the linkchecker module. + * + * @ingroup views_access_plugins + */ +class linkchecker_plugin_access extends views_plugin_access { + + /** + * {@inheritdoc} + */ + function access($account) { + return _linkchecker_access($account); + } + + /** + * {@inheritdoc} + */ + function get_access_callback() { + return array('_linkchecker_access', array()); + } + + /** + * {@inheritdoc} + */ + function summary_title() { + return t('Linkchecker'); + } + +} diff --git a/dkan/modules/contrib/markdowneditor/PATCHES.txt b/dkan/modules/contrib/markdowneditor/PATCHES.txt index 417541ed5..355a7bee2 100644 --- a/dkan/modules/contrib/markdowneditor/PATCHES.txt +++ b/dkan/modules/contrib/markdowneditor/PATCHES.txt @@ -1,4 +1,4 @@ The following patches have been applied to this project: -- http://drupal.org/files/remove-dsm-from-hook-install-2045225-1.patch +- https://drupal.org/files/remove-dsm-from-hook-install-2045225-1.patch This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/media/includes/media.fields.inc b/dkan/modules/contrib/media/includes/media.fields.inc index 99be107b5..6240b5c90 100644 --- a/dkan/modules/contrib/media/includes/media.fields.inc +++ b/dkan/modules/contrib/media/includes/media.fields.inc @@ -168,7 +168,7 @@ function media_field_widget_form(&$form, &$form_state, $field, $instance, $langc foreach ($items as $item) { $elements[$delta] = $element; $elements[$delta]['#default_value'] = $item; - $elements[$delta]['#weight'] = $delta; + $elements[$delta]['#weight'] = isset($item['_weight']) ? $item['_weight'] : $delta; $delta++; } // And then add one more empty row for new uploads except when this is a diff --git a/dkan/modules/contrib/media/media.api.php b/dkan/modules/contrib/media/media.api.php index ecde61b24..626d7b8fa 100644 --- a/dkan/modules/contrib/media/media.api.php +++ b/dkan/modules/contrib/media/media.api.php @@ -135,3 +135,18 @@ function hook_media_browser_params_alter(&$stored_params) { $stored_params['types'][] = 'document'; unset($stored_params['enabledPlugins'][0]); } + +/** + * + * Alter the media multiple elements widget + * + * @param $table + * the table of elements that will be rendered via theme_table() + * @param $element + * elements that are actually attached + * + * @see theme_media_widget_multiple() + */ +function hook_media_widget_multiple_alter(&$table, &$element) { + $table['attributes']['class'][] = 'myclass'; +} diff --git a/dkan/modules/contrib/media/media.info b/dkan/modules/contrib/media/media.info index 01b54674b..ba4369589 100644 --- a/dkan/modules/contrib/media/media.info +++ b/dkan/modules/contrib/media/media.info @@ -24,9 +24,8 @@ configure = admin/config/media/browser ; We have to add a fake version so Git checkouts do not fail Media dependencies version = 7.x-2.x-dev -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/media.module b/dkan/modules/contrib/media/media.module index c17e86158..cccf8797c 100644 --- a/dkan/modules/contrib/media/media.module +++ b/dkan/modules/contrib/media/media.module @@ -168,6 +168,9 @@ function media_menu_local_tasks_alter(&$data, $router_item, $root_path) { function media_admin_paths() { $paths['media/*/edit/*'] = TRUE; $paths['media/*/format-form'] = TRUE; + if (module_exists('admin_language')) { + $paths['media/ajax/*'] = TRUE; // For admin_language module compatibility. + } // If the media browser theme is set to the admin theme, ensure it gets set // as an admin path as well. @@ -245,6 +248,9 @@ function media_ajax_upload() { $form_parents = func_get_args(); $form_build_id = (string) array_pop($form_parents); + // Sanitize form parents before using them. + $form_parents = array_filter($form_parents, 'element_child'); + if (empty($_POST['form_build_id']) || $form_build_id != $_POST['form_build_id']) { // Invalid request. drupal_set_message(t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', array('@size' => format_size(file_upload_max_size()))), 'error'); diff --git a/dkan/modules/contrib/media/modules/media_bulk_upload/includes/media_bulk_upload.admin.inc b/dkan/modules/contrib/media/modules/media_bulk_upload/includes/media_bulk_upload.admin.inc index 4fdd9ada2..af755eaf5 100644 --- a/dkan/modules/contrib/media/modules/media_bulk_upload/includes/media_bulk_upload.admin.inc +++ b/dkan/modules/contrib/media/modules/media_bulk_upload/includes/media_bulk_upload.admin.inc @@ -15,10 +15,16 @@ function media_bulk_upload_import($form, &$form_state) { $form['directory'] = array( '#type' => 'textfield', '#title' => t('Directory'), - '#description' => t('Enter the absolute directory on the web server to look for files. Subdirectories inside this directory will not be scanned.'), + '#description' => t('Enter the absolute directory on the web server to look for files. Subdirectories inside this directory will not be scanned unless the Recurse through subdirectories box is checked.'), '#required' => TRUE, ); + $form['recurse'] = array( + '#type' => 'checkbox', + '#title' => t('Recurse through subdirectories'), + '#description' => 'Iterate over the directory looking for files within subfolders that match the pattern.', + ); + $form['to_directory'] = array( '#type' => 'textfield', '#title' => t('To Directory'), @@ -63,6 +69,7 @@ function media_bulk_upload_import_validate($form, &$form_state) { if ($form_state['values']['op'] != t('Confirm')) { $directory = $form_state['values']['directory']; $pattern = $form_state['values']['pattern']; + $recurse = $form_state['values']['recurse']; if (!is_dir($directory)) { form_set_error('directory', t('The provided directory does not exist.')); } @@ -77,7 +84,7 @@ function media_bulk_upload_import_validate($form, &$form_state) { '\\*' => '.*', '\\?' => '.?', )); - $files = file_scan_directory($directory, '/^(' . $pattern_quoted . ')$/', array('recurse' => FALSE)); + $files = file_scan_directory($directory, '/^(' . $pattern_quoted . ')$/i', array('recurse' => $recurse)); $files = array_keys($files); if (empty($files)) { form_set_error('pattern', t('No files were found in %directory matching the regular expression %pattern', array('%directory' => $directory, '%pattern' => $pattern_quoted))); diff --git a/dkan/modules/contrib/media/modules/media_bulk_upload/media_bulk_upload.info b/dkan/modules/contrib/media/modules/media_bulk_upload/media_bulk_upload.info index 0d92c3ad6..95ab5467f 100644 --- a/dkan/modules/contrib/media/modules/media_bulk_upload/media_bulk_upload.info +++ b/dkan/modules/contrib/media/modules/media_bulk_upload/media_bulk_upload.info @@ -15,9 +15,8 @@ test_dependencies[] = plupload files[] = includes/MediaBrowserBulkUpload.inc files[] = tests/media_bulk_upload.test -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/modules/media_internet/media_internet.info b/dkan/modules/contrib/media/modules/media_internet/media_internet.info index ab0d85232..a27a34c3c 100644 --- a/dkan/modules/contrib/media/modules/media_internet/media_internet.info +++ b/dkan/modules/contrib/media/modules/media_internet/media_internet.info @@ -12,9 +12,8 @@ files[] = includes/MediaInternetNoHandlerException.inc files[] = includes/MediaInternetValidationException.inc files[] = tests/media_internet.test -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/modules/media_internet/tests/media_internet_test.info b/dkan/modules/contrib/media/modules/media_internet/tests/media_internet_test.info index 1dec6e0b1..b8e3a6bee 100644 --- a/dkan/modules/contrib/media/modules/media_internet/tests/media_internet_test.info +++ b/dkan/modules/contrib/media/modules/media_internet/tests/media_internet_test.info @@ -7,9 +7,8 @@ hidden = TRUE files[] = includes/MediaInternetTestStreamWrapper.inc files[] = includes/MediaInternetTestHandler.inc -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/modules/media_migrate_file_types/media_migrate_file_types.info b/dkan/modules/contrib/media/modules/media_migrate_file_types/media_migrate_file_types.info index 04084bd7d..4d836facc 100644 --- a/dkan/modules/contrib/media/modules/media_migrate_file_types/media_migrate_file_types.info +++ b/dkan/modules/contrib/media/modules/media_migrate_file_types/media_migrate_file_types.info @@ -8,9 +8,8 @@ dependencies[] = media configure = admin/structure/file-types/upgrade -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg/includes/media_wysiwyg.filter.inc b/dkan/modules/contrib/media/modules/media_wysiwyg/includes/media_wysiwyg.filter.inc index 03daeae9d..a307c2f28 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg/includes/media_wysiwyg.filter.inc +++ b/dkan/modules/contrib/media/modules/media_wysiwyg/includes/media_wysiwyg.filter.inc @@ -5,7 +5,7 @@ * Functions related to the WYSIWYG editor and the media input filter. */ -define('MEDIA_WYSIWYG_TOKEN_REGEX', '/\[\[.+?"type":"media".+?\]\]/s'); +define('MEDIA_WYSIWYG_TOKEN_REGEX', '/\[\[\{.*?"type":"media".+?\}\]\]/s'); /** * Filter callback for media markup filter. @@ -311,14 +311,19 @@ function media_wysiwyg_token_to_markup($match, $wysiwyg = FALSE, $langcode = NUL drupal_add_js(array('mediaDataMap' => array($file->fid => $data)), 'setting'); $element['#attributes']['data-fid'] = $file->fid; $element['#attributes']['data-media-element'] = '1'; - $element['#attributes']['class'][] = 'media-element'; + if (is_array($element['#attributes']['class'])) { + $element['#attributes']['class'][] = 'media-element'; + } + else { + $element['#attributes']['class'] .= 'media-element'; + } } else { // Display the field elements. $element = array(); // Render the file entity, for sites using the file_entity rendering method. if (variable_get('media_wysiwyg_default_render', 'file_entity') == 'file_entity') { - $element['content'] = file_view($file, $tag_info['view_mode']); + $element['content'] = file_view($file, $tag_info['view_mode'], $langcode); } $element['content']['file'] = media_wysiwyg_get_file_without_label($file, $tag_info['view_mode'], $settings, $langcode); // Overwrite or set the file #alt attribute if it has been set in this @@ -383,31 +388,51 @@ function media_wysiwyg_token_to_markup($match, $wysiwyg = FALSE, $langcode = NUL } /** - * Parse the field array from the collapsed AJAX string. + * Parse the 'fields' entry of $tag_info into structured, sanitized fields data. + * + * The keys of the fields array are the string equivalent of accessing the + * field's value, e.g. 'field_file_image_alt_text[und][0][value]' and the value + * is the actual field value. These parts are turned into sanitized fields data + * arrays with the full hierarchy of language, deltas, data column and finally + * value. + * + * Only configured or programmed fields present in the site's installation is + * parsed and returned. + * + * @param array $tag_info + * Media token as PHP array equivalent. + * + * @return array + * An array of fields with sanitized field data structures. */ -function media_wysiwyg_filter_field_parser($tag_info) { +function media_wysiwyg_filter_field_parser(array $tag_info) { $fields = array(); if (isset($tag_info['fields'])) { - // Field names that end in [format] are associated with long-text fields that may have HTML Entities. - // Those values will need to be URLDecoded as well as HTMLDecoded. + // Field value reference candidates (keys) that end in [format] are + // associated with long-text fields that may have HTML Entities. Those + // values will need to be URLDecoded as well as HTMLDecoded. $url_encoded_fields = array(); - foreach($tag_info['fields'] as $field_name => $field_value) { - if (preg_match('/\[format\]$/', $field_name) > 0){ - $url_encoded_fields[] = preg_replace('/\[format\]$/', '[value]', $field_name); + foreach ($tag_info['fields'] as $candidate => $field_value) { + if (preg_match('/\[format\]$/', $candidate) > 0) { + $url_encoded_fields[] = preg_replace('/\[format\]$/', '[value]', $candidate); } } - foreach($tag_info['fields'] as $field_name => $field_value) { - if (strpos($field_name, 'field_') === 0) { - $parsed_field = explode('[', str_replace(']', '', $field_name)); - $ref = &$fields; + foreach ($tag_info['fields'] as $candidate => $field_value) { + if (strpos($candidate, 'field_') === 0) { + $parsed_field = explode('[', str_replace(']', '', $candidate)); + // We are garuanteed to have a value in $parsed_field[0]. + $info = field_info_field($parsed_field[0]); + if (!$info) { + // Not an existing/configured field. + continue; + } // Certain types of fields, because of differences in markup, end up // here with incomplete arrays. Make a best effort to support as many // types of fields as possible. // Single-value select lists show up here with only 2 array items. if (count($parsed_field) == 2) { - $info = field_info_field($parsed_field[0]); if ($info && !empty($info['columns'])) { // Assume single-value. $parsed_field[] = 0; @@ -417,21 +442,20 @@ function media_wysiwyg_filter_field_parser($tag_info) { } // Multi-value select lists show up here with 3 array items. elseif (count($parsed_field) == 3 && (empty($parsed_field[2]) || is_numeric($parsed_field[2]))) { - $info = field_info_field($parsed_field[0]); // They just need the value column. $parsed_field[3] = key($info['columns']); } // Each key of the field needs to be the child of the previous key. + $ref = &$fields; foreach ($parsed_field as $key) { if (!isset($ref[$key])) { $ref[$key] = array(); } $ref = &$ref[$key]; } - // The value should be set at the deepest level. - if (in_array($field_name, $url_encoded_fields)){ + if (in_array($candidate, $url_encoded_fields)) { // Fields that use rich-text markup will be urlencoded. $ref = urldecode(decode_entities($field_value)); } @@ -441,6 +465,16 @@ function media_wysiwyg_filter_field_parser($tag_info) { } } } + // Strip fields for empty values. This is necessary to do post parsing of + // all field entries as they may refer to the same field several times. + foreach ($fields as $field_name => $field_languages) { + $info = field_info_field($field_name); + if (isset($field_languages) && is_array($field_languages)) { + foreach ($field_languages as $lang => $items) { + $fields[$field_name][$lang] = _field_filter_items($info, $items); + } + } + } } return $fields; } diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg/js/media_wysiwyg.format_form.js b/dkan/modules/contrib/media/modules/media_wysiwyg/js/media_wysiwyg.format_form.js index 1e1b0391c..708ae6d77 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg/js/media_wysiwyg.format_form.js +++ b/dkan/modules/contrib/media/modules/media_wysiwyg/js/media_wysiwyg.format_form.js @@ -25,7 +25,7 @@ Drupal.behaviors.mediaFormatForm = { // Adding the buttons should only be done once in order to prevent multiple // buttons from being added if part of the form is updated via AJAX $('#media-wysiwyg-format-form').once('format', function() { - $('<a class="button fake-ok">' + Drupal.t('Submit') + '</a>').appendTo($('#media-wysiwyg-format-form')).bind('click', Drupal.media.formatForm.submit); + $('<a class="button fake-ok" href="javascript:void(0)">' + Drupal.t('Submit') + '</a>').appendTo($('#media-wysiwyg-format-form')).bind('click', Drupal.media.formatForm.submit); }); } }; diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.info b/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.info index 4105ebb3f..88a037747 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.info +++ b/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.info @@ -16,9 +16,8 @@ files[] = tests/media_wysiwyg.paragraph_fix_filter.test configure = admin/config/media/browser -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.install b/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.install index ae2685662..6a2f3ea4a 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.install +++ b/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.install @@ -182,9 +182,9 @@ function media_wysiwyg_update_7205() { // Migrate the configuration from the old variables into the new DB tables. $types = file_type_load_all(TRUE); foreach ($types as $type) { - $enabled = variable_get("media_wysiwyg_view_mode_" . $type->type . "_file_wysiwyg_restricted_view_modes_status", FALSE); + $enabled = variable_get("media_wysiwyg_view_mode_" . $type->type . "_wysiwyg_restricted_view_modes_status", FALSE); if ($enabled) { - $wysiwyg_restricted_view_modes = variable_get("media_wysiwyg_view_mode_" . $type->type . "_file_wysiwyg_restricted_view_modes", array()); + $wysiwyg_restricted_view_modes = variable_get("media_wysiwyg_view_mode_" . $type->type . "_wysiwyg_restricted_view_modes", array()); foreach ($wysiwyg_restricted_view_modes as $wysiwyg_restricted_view_mode) { db_insert('media_restrict_wysiwyg') ->fields(array( @@ -195,7 +195,7 @@ function media_wysiwyg_update_7205() { } } - $enabled = variable_get("media_wysiwyg_view_mode_" . $type->type . "_wysiwyg_view_mode_status", FALSE); + $enabled = variable_get("media_wysiwyg_view_mode_" . $type->type . "_file_wysiwyg_view_mode_status", FALSE); if ($enabled) { $file_wysiwyg_view_mode = variable_get("media_wysiwyg_view_mode_" . $type->type . "_file_wysiwyg_view_mode", 'wysiwyg'); db_insert('media_view_mode_wysiwyg') diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.module b/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.module index 0a8482e6b..4777736c8 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.module +++ b/dkan/modules/contrib/media/modules/media_wysiwyg/media_wysiwyg.module @@ -597,6 +597,15 @@ function media_wysiwyg_file_displays_alter(&$displays, $file, $view_mode) { } } } + // For integration/support of the picture module https://www.drupal.org/project/picture. + // Disable Picture display in WYSIWYG mode. Normal <img> will be rendered + // instead. CKEditor and Media WYSIWYG modules with render with common <img> + // while frontend will render full <picture> output as usual. + if (module_exists('picture')) { + if (!empty($file->override['wysiwyg']) && !empty($displays['file_field_picture']['status'])) { + $displays['file_field_picture']['status'] = 0; + } + } } /** diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg/tests/media_wysiwyg.macro.test b/dkan/modules/contrib/media/modules/media_wysiwyg/tests/media_wysiwyg.macro.test index 82af18aff..b3407fe38 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg/tests/media_wysiwyg.macro.test +++ b/dkan/modules/contrib/media/modules/media_wysiwyg/tests/media_wysiwyg.macro.test @@ -6,28 +6,25 @@ */ /** - * Defines media macro test cases. + * Base class for testing rendered wysiwyg macros. */ -class MediaWYSIWYGWYSIWYGOverridesTest extends MediaWYSIWYGTestHelper { +abstract class MediaWYSIWYGMacroTestHelper extends MediaWYSIWYGTestHelper { /** - * Provide test information. + * Common setup routines for rendered media macros. */ - public static function getInfo() { - return array( - 'name' => t('Media WYSIWYG WYSIWYG overrides'), - 'description' => t('Tests that overridden attributes display correct.'), - 'group' => t('Media WYSIWYG'), - 'dependencies' => array('token'), - ); - } - public function setUp() { - parent::setUp('token'); + parent::setUp(array('field_ui', 'token')); // Create and log in a user. - $account = $this->drupalCreateUser(array('create article content', 'administer filters', 'use text format filtered_html')); - $this->drupalLogin($account); + $this->admin_user = $this->drupalCreateUser(array( + 'administer file types', + 'administer fields', + 'administer filters', + 'create article content', + 'use text format filtered_html', + )); + $this->drupalLogin($this->admin_user); // Enable the media filter for full html. $edit = array( @@ -37,6 +34,74 @@ class MediaWYSIWYGWYSIWYGOverridesTest extends MediaWYSIWYGTestHelper { $this->drupalPost('admin/config/content/formats/filtered_html', $edit, t('Save configuration')); } +} + +/** + * Defines rendered media macros test cases. + */ +class MediaWYSIWYGRenderMacrosTest extends MediaWYSIWYGMacroTestHelper { + + /** + * Test information. + */ + public static function getInfo() { + return array( + 'name' => t('Media WYSIWYG Rendered Macros test'), + 'description' => t('Test that rendered macros are displayed correctly.'), + 'group' => t('Media WYSIWYG'), + 'dependencies' => array('token'), + ); + } + + /** + * Test that displayed fields on file entity are rendered correctly. + */ + public function testEmptyField() { + // Add a field as part of the rendered macro. + $edit = array( + 'fields[field_file_image_title_text][type]' => 'text_default', + ); + $this->drupalPost('admin/structure/file-types/manage/image/display/preview', $edit, t('Save')); + + // Assert that fields that are enabled in display settings for macro are NOT + // rendered if empty. + $files = $this->drupalGetTestFiles('image'); + $attributes = array( + 'alt' => $this->randomName(), + 'title' => '', + ); + $fields = array( + 'field_file_image_alt_text[und][0][value]' => $attributes['alt'], + 'field_file_image_title_text[und][0][value]' => $attributes['title'], + ); + $files[0]->field_file_image_alt_text[LANGUAGE_NONE][0]['value'] = $attributes['alt']; + $files[0]->field_file_image_title_text[LANGUAGE_NONE][0]['value'] = $attributes['title']; + $file = file_save($files[0]); + $nid = $this->createNode($file->fid, $attributes, $fields); + $this->drupalGet('node/' . $nid); + // Assert that the empty field isn't rendered. + $this->assertNoPattern('|<div class="[^">]*field-name-field-file-image-title-text|', t('Displayed text field with empty value not rendered.')); + } + +} + +/** + * Defines media macro override test cases. + */ +class MediaWYSIWYGWYSIWYGOverridesTest extends MediaWYSIWYGMacroTestHelper { + + /** + * Provide test information. + */ + public static function getInfo() { + return array( + 'name' => t('Media WYSIWYG WYSIWYG overrides'), + 'description' => t('Tests that overridden attributes display correct.'), + 'group' => t('Media WYSIWYG'), + 'dependencies' => array('token'), + ); + } + /** * Test image media overrides. */ diff --git a/dkan/modules/contrib/media/modules/media_wysiwyg_view_mode/media_wysiwyg_view_mode.info b/dkan/modules/contrib/media/modules/media_wysiwyg_view_mode/media_wysiwyg_view_mode.info index c76c4d947..bbeff2411 100644 --- a/dkan/modules/contrib/media/modules/media_wysiwyg_view_mode/media_wysiwyg_view_mode.info +++ b/dkan/modules/contrib/media/modules/media_wysiwyg_view_mode/media_wysiwyg_view_mode.info @@ -3,9 +3,8 @@ description = DEPRECATED, this folder is only here so that the module can be uni package = Media core = 7.x -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/modules/mediafield/mediafield.info b/dkan/modules/contrib/media/modules/mediafield/mediafield.info index 70ac49567..61c26869b 100644 --- a/dkan/modules/contrib/media/modules/mediafield/mediafield.info +++ b/dkan/modules/contrib/media/modules/mediafield/mediafield.info @@ -4,9 +4,8 @@ package = Media core = 7.x dependencies[] = media -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/media/tests/media_module_test.info b/dkan/modules/contrib/media/tests/media_module_test.info index 9644b7b8d..c7360b8e6 100644 --- a/dkan/modules/contrib/media/tests/media_module_test.info +++ b/dkan/modules/contrib/media/tests/media_module_test.info @@ -6,9 +6,8 @@ hidden = TRUE files[] = includes/MediaModuleTest.inc -; Information added by Drupal.org packaging script on 2017-10-19 -version = "7.x-2.13" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.x-2.19" core = "7.x" project = "media" -datestamp = "1508430548" - +datestamp = "1524677887" diff --git a/dkan/modules/contrib/og/PATCHES.txt b/dkan/modules/contrib/og/PATCHES.txt index 7044974c7..710705b48 100644 --- a/dkan/modules/contrib/og/PATCHES.txt +++ b/dkan/modules/contrib/og/PATCHES.txt @@ -1,5 +1,5 @@ The following patches have been applied to this project: -- http://drupal.org/files/issues/og-add_users_and_entities_with_drush-1090438-12.patch +- https://drupal.org/files/issues/og-add_users_and_entities_with_drush-1090438-12.patch - https://www.drupal.org/files/issues/og_actions-bug-vbo-delete.patch - https://www.drupal.org/files/issues/og-missing-permission-roles-2301831-1.patch diff --git a/dkan/modules/contrib/views_autocomplete_filters/PATCHES.txt b/dkan/modules/contrib/views_autocomplete_filters/PATCHES.txt index 85fee513b..d86182033 100644 --- a/dkan/modules/contrib/views_autocomplete_filters/PATCHES.txt +++ b/dkan/modules/contrib/views_autocomplete_filters/PATCHES.txt @@ -1,5 +1,5 @@ The following patches have been applied to this project: -- http://www.drupal.org/files/issues/views_autocomplete_filters-cache-2374709-2.patch -- http://www.drupal.org/files/issues/views_autocomplete_filters-content-pane-2317351-4.patch +- https://www.drupal.org/files/issues/views_autocomplete_filters-cache-2374709-2.patch +- https://www.drupal.org/files/issues/views_autocomplete_filters-content-pane-2317351-4.patch This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info b/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info index 0be3d31b8..b3e7a64f4 100644 --- a/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info +++ b/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info @@ -30,4 +30,4 @@ features[variable][] = panelizer_node:data_dashboard_default features[views_view][] = data_dashboards features[views_view][] = front_page_dashboards_list features_exclude[dependencies][dkan_topics] = dkan_topics -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_data_story/README.md b/dkan/modules/dkan/dkan_data_story/README.md index de5980b2b..872923e63 100644 --- a/dkan/modules/dkan/dkan_data_story/README.md +++ b/dkan/modules/dkan/dkan_data_story/README.md @@ -1,6 +1,6 @@ # DKAN Data Story -DKAN Data Story adds a new content type for "data stories" to DKAN. Data Stories can have [complex layouts](http://docs.getdkan.com/dkan-documentation/dkan-users-guide/customize-dkan-pages-layouts-and-components-using-panels) using [Panels](http://www.drupal.org/project/panels) and [Panelizer](https://www.drupal.org/project/panelizer) and contain embedded [visualiztions](https://github.com/GetDKAN/visualization_entity) and other elements. +DKAN Data Story adds a new content type for "data stories" to DKAN. Data Stories can have [complex layouts](https://docs.getdkan.com/dkan-documentation/dkan-users-guide/customize-dkan-pages-layouts-and-components-using-panels) using [Panels](https://www.drupal.org/project/panels) and [Panelizer](https://www.drupal.org/project/panelizer) and contain embedded [visualiztions](https://github.com/GetDKAN/visualization_entity) and other elements. Module includes: diff --git a/dkan/modules/dkan/dkan_data_story/dkan_data_story.info b/dkan/modules/dkan/dkan_data_story/dkan_data_story.info index dddebb39a..6e03f206c 100644 --- a/dkan/modules/dkan/dkan_data_story/dkan_data_story.info +++ b/dkan/modules/dkan/dkan_data_story/dkan_data_story.info @@ -55,4 +55,4 @@ features_exclude[dependencies][image] = image features_exclude[dependencies][strongarm] = strongarm features_exclude[dependencies][taxonomy] = taxonomy no autodetect = 1 -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_dataset/README.md b/dkan/modules/dkan/dkan_dataset/README.md index 8449e6f6c..9ce599773 100644 --- a/dkan/modules/dkan/dkan_dataset/README.md +++ b/dkan/modules/dkan/dkan_dataset/README.md @@ -14,7 +14,7 @@ DKAN Dataset is currently managed in code on Github but is mirrored on Drupal.or This module REQUIRES implementers to use "drush make". If you only use "drush download" you will miss key dependencies for required modules and libraries. -See installation instructions here: http://docs.getdkan.com/dkan-documentation/dkan-developers/adding-dkan-features-existing-drupal-site#Installing_DKAN_Dataset +See installation instructions here: https://docs.getdkan.com/dkan-documentation/dkan-developers/adding-dkan-features-existing-drupal-site#Installing_DKAN_Dataset ## Contributing @@ -24,6 +24,6 @@ If you can, please cross reference commits in this repo to the corresponding iss ``` NuCivic/dkan#issue_id -``` +``` to any commit message or comment replacing **issue_id** with the corresponding issue id. diff --git a/dkan/modules/dkan/dkan_dataset/dkan_dataset.info b/dkan/modules/dkan/dkan_dataset/dkan_dataset.info index 7673468a7..3aef906c9 100644 --- a/dkan/modules/dkan/dkan_dataset/dkan_dataset.info +++ b/dkan/modules/dkan/dkan_dataset/dkan_dataset.info @@ -33,4 +33,4 @@ features[ctools][] = views:views_default:3.0 features[features_api][] = api:2 features[variable][] = pathauto_node_dataset_pattern features[variable][] = pathauto_node_resource_pattern -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_dataset/dkan_dataset.module b/dkan/modules/dkan/dkan_dataset/dkan_dataset.module index 31f5b3fe5..d9cd5c7a2 100644 --- a/dkan/modules/dkan/dkan_dataset/dkan_dataset.module +++ b/dkan/modules/dkan/dkan_dataset/dkan_dataset.module @@ -1040,7 +1040,7 @@ function dkan_dataset_preview_url_arcgis($node) { // Get resource API link URL. $resource_wrapper = entity_metadata_wrapper('node', $node); if ($resource_wrapper->field_link_api->value()) { - return 'http://www.arcgis.com/home/webmap/viewer.html?url=' . $resource_wrapper->field_link_api->url->value(); + return 'https://www.arcgis.com/home/webmap/viewer.html?url=' . $resource_wrapper->field_link_api->url->value(); } } @@ -1280,8 +1280,8 @@ function dkan_dataset_release_date($node) { // Last time a dataset was harvested is supposedly the time of the last // update. - if (isset($node->field_harvest_source_issued) && - !empty($node->field_harvest_source_issued->value())) { + $issued = $node->field_harvest_source_issued->value(); + if (isset($node->field_harvest_source_issued) && !empty($issued)) { $date = format_date($node->field_harvest_source_issued->value(), 'iso_8601_date'); } else { diff --git a/dkan/modules/dkan/dkan_dataset/import/rdf.php b/dkan/modules/dkan/dkan_dataset/import/rdf.php index cdbf79c5f..2c646283d 100644 --- a/dkan/modules/dkan/dkan_dataset/import/rdf.php +++ b/dkan/modules/dkan/dkan_dataset/import/rdf.php @@ -5,6 +5,6 @@ * Includes dcat and dcterms rdf definitions. */ -$dcat = unserialize('a:5:{s:3:"uri";s:26:"http://www.w3.org/ns/dcat#";s:5:"title";a:0:{}s:11:"description";a:0:{}s:5:"terms";a:4:{s:10:"rdfs_class";a:13:{s:33:"http://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"http://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"http://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"http://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"http://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"http://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"http://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"http://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"http://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/dcmitype/Dataset";a:5:{s:3:"uri";s:35:"http://purl.org/dc/dcmitype/Dataset";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:45:"http://www.w3.org/2000/01/rdf-schema#Resource";a:5:{s:3:"uri";s:45:"http://www.w3.org/2000/01/rdf-schema#Resource";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://www.w3.org/2001/XMLSchema#integer";a:5:{s:3:"uri";s:40:"http://www.w3.org/2001/XMLSchema#integer";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:43:"http://www.w3.org/2004/02/skos/core#Concept";a:5:{s:3:"uri";s:43:"http://www.w3.org/2004/02/skos/core#Concept";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:49:"http://www.w3.org/2004/02/skos/core#ConceptScheme";a:5:{s:3:"uri";s:49:"http://www.w3.org/2004/02/skos/core#ConceptScheme";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:9:"owl_class";a:7:{s:33:"http://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"http://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"http://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"http://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"http://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"http://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"http://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"http://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"http://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:14:{s:35:"http://www.w3.org/ns/dcat#accessURL";a:7:{s:3:"uri";s:35:"http://www.w3.org/ns/dcat#accessURL";s:5:"label";a:1:{s:3:"und";s:10:"access URL";}s:7:"comment";a:1:{s:3:"und";s:245:"points to the location of a distribution. This can be a direct download link, a link to an HTML page containing a link to the actual data, Feed, Web Service etc. the semantic is determined by its domain (Distribution, Feed, WebService, Download)";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:45:"http://www.w3.org/2000/01/rdf-schema#Resource";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"http://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"http://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://www.w3.org/ns/dcat#dataDictionary";a:7:{s:3:"uri";s:40:"http://www.w3.org/ns/dcat#dataDictionary";s:5:"label";a:1:{s:3:"und";s:15:"data dictionary";}s:7:"comment";a:1:{s:3:"und";s:64:"links a dataset to a dictionary that helps interpreting the data";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://www.w3.org/ns/dcat#dataQuality";a:7:{s:3:"uri";s:37:"http://www.w3.org/ns/dcat#dataQuality";s:5:"label";a:1:{s:3:"und";s:12:"data quality";}s:7:"comment";a:1:{s:3:"und";s:185:"describes the quality of data e.g. precision. This should not be used to describe the data collection characteristics, other more specialized statistical properties can be used instead.";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"http://www.w3.org/ns/dcat#dataset";a:7:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#dataset";s:5:"label";a:1:{s:3:"und";s:7:"dataset";}s:7:"comment";a:1:{s:3:"und";s:37:"a dataset that is part of the catalog";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://www.w3.org/ns/dcat#distribution";a:7:{s:3:"uri";s:38:"http://www.w3.org/ns/dcat#distribution";s:5:"label";a:1:{s:3:"und";s:12:"distribution";}s:7:"comment";a:1:{s:3:"und";s:56:"connects a dataset to one of its available distributions";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://www.w3.org/ns/dcat#granularity";a:7:{s:3:"uri";s:37:"http://www.w3.org/ns/dcat#granularity";s:5:"label";a:1:{s:3:"und";s:11:"granularity";}s:7:"comment";a:1:{s:3:"und";s:98:"describes the level of granularity of data in a dataset. The granularity can be in time, place etc";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"http://www.w3.org/ns/dcat#keyword";a:7:{s:3:"uri";s:33:"http://www.w3.org/ns/dcat#keyword";s:5:"label";a:1:{s:3:"und";s:7:"keyword";}s:7:"comment";a:1:{s:3:"und";s:38:"a keyword or tag describing the datase";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:32:"http://www.w3.org/ns/dcat#record";a:7:{s:3:"uri";s:32:"http://www.w3.org/ns/dcat#record";s:5:"label";a:1:{s:3:"und";s:6:"record";}s:7:"comment";a:1:{s:3:"und";s:30:"links a catalog to its records";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:39:"http://www.w3.org/ns/dcat#CatalogRecord";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:30:"http://www.w3.org/ns/dcat#size";a:7:{s:3:"uri";s:30:"http://www.w3.org/ns/dcat#size";s:5:"label";a:1:{s:3:"und";s:4:"size";}s:7:"comment";a:1:{s:3:"und";s:26:"the size of a distribution";}s:6:"domain";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:31:"http://purl.org/dc/terms/extent";}s:7:"inverse";a:0:{}}s:31:"http://www.w3.org/ns/dcat#theme";a:7:{s:3:"uri";s:31:"http://www.w3.org/ns/dcat#theme";s:5:"label";a:1:{s:3:"und";s:5:"theme";}s:7:"comment";a:1:{s:3:"und";s:68:"the main category of the dataset. A dataset can have multiple themes";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:43:"http://www.w3.org/2004/02/skos/core#Concept";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:39:"http://www.w3.org/ns/dcat#themeTaxonomy";a:7:{s:3:"uri";s:39:"http://www.w3.org/ns/dcat#themeTaxonomy";s:5:"label";a:1:{s:3:"und";s:6:"themes";}s:7:"comment";a:1:{s:3:"und";s:74:"the knowledge organization system (KOS) used to classify catalogs datasets";}s:6:"domain";a:1:{i:0;s:33:"http://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:49:"http://www.w3.org/2004/02/skos/core#ConceptScheme";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}s:21:"owl_property_datatype";a:1:{s:31:"http://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"http://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"http://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"http://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:5:{s:3:"xml";s:36:"http://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"http://www.w3.org/1999/02/22-rdf-syntax-ns#";i:0;s:37:"http://www.w3.org/2000/01/rdf-schema#";s:3:"dct";s:25:"http://purl.org/dc/terms/";s:3:"owl";s:30:"http://www.w3.org/2002/07/owl#";}}'); +$dcat = unserialize('a:5:{s:3:"uri";s:26:"https://www.w3.org/ns/dcat#";s:5:"title";a:0:{}s:11:"description";a:0:{}s:5:"terms";a:4:{s:10:"rdfs_class";a:13:{s:33:"https://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"https://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"https://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"https://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"https://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"https://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"https://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"https://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"https://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"https://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"https://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"https://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/dcmitype/Dataset";a:5:{s:3:"uri";s:35:"http://purl.org/dc/dcmitype/Dataset";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:45:"https://www.w3.org/2000/01/rdf-schema#Resource";a:5:{s:3:"uri";s:45:"https://www.w3.org/2000/01/rdf-schema#Resource";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"https://www.w3.org/2001/XMLSchema#integer";a:5:{s:3:"uri";s:40:"https://www.w3.org/2001/XMLSchema#integer";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:43:"https://www.w3.org/2004/02/skos/core#Concept";a:5:{s:3:"uri";s:43:"https://www.w3.org/2004/02/skos/core#Concept";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:49:"https://www.w3.org/2004/02/skos/core#ConceptScheme";a:5:{s:3:"uri";s:49:"https://www.w3.org/2004/02/skos/core#ConceptScheme";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:9:"owl_class";a:7:{s:33:"https://www.w3.org/ns/dcat#Catalog";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Catalog";s:5:"label";a:1:{s:3:"und";s:7:"Catalog";}s:7:"comment";a:1:{s:3:"und";s:48:"A curated collection of metadata about datasets";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"https://www.w3.org/ns/dcat#CatalogRecord";a:5:{s:3:"uri";s:39:"https://www.w3.org/ns/dcat#CatalogRecord";s:5:"label";a:1:{s:3:"und";s:14:"Catalog Record";}s:7:"comment";a:1:{s:3:"und";s:55:"A record in a data catalog, describing a single dataset";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"https://www.w3.org/ns/dcat#Dataset";a:5:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#Dataset";s:5:"label";a:1:{s:3:"und";s:7:"Dataset";}s:7:"comment";a:1:{s:3:"und";s:122:"A collection of data, published or curated by a single source, and available for access or download in one or more formats";}s:10:"superclass";a:1:{i:0;s:35:"http://purl.org/dc/dcmitype/Dataset";}s:8:"disjoint";a:0:{}}s:38:"https://www.w3.org/ns/dcat#Distribution";a:5:{s:3:"uri";s:38:"https://www.w3.org/ns/dcat#Distribution";s:5:"label";a:1:{s:3:"und";s:12:"Distribution";}s:7:"comment";a:1:{s:3:"und";s:299:"represents a specific available form of a dataset. Each dataset might be available in different forms, these forms might represent different formats of the dataset, different endpoints,... Examples of Distribution include a downloadable CSV file, an XLS file representing the dataset, an RSS feed…";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"https://www.w3.org/ns/dcat#Download";a:5:{s:3:"uri";s:34:"https://www.w3.org/ns/dcat#Download";s:5:"label";a:1:{s:3:"und";s:8:"Download";}s:7:"comment";a:1:{s:3:"und";s:51:"represents a downloadable distribution of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:30:"https://www.w3.org/ns/dcat#Feed";a:5:{s:3:"uri";s:30:"https://www.w3.org/ns/dcat#Feed";s:5:"label";a:1:{s:3:"und";s:4:"Feed";}s:7:"comment";a:1:{s:3:"und";s:46:"represents availability of a dataset as a feed";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}s:36:"https://www.w3.org/ns/dcat#WebService";a:5:{s:3:"uri";s:36:"https://www.w3.org/ns/dcat#WebService";s:5:"label";a:1:{s:3:"und";s:11:"Web Service";}s:7:"comment";a:1:{s:3:"und";s:69:"represents a web service that enables access to the data of a dataset";}s:10:"superclass";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:14:{s:35:"https://www.w3.org/ns/dcat#accessURL";a:7:{s:3:"uri";s:35:"https://www.w3.org/ns/dcat#accessURL";s:5:"label";a:1:{s:3:"und";s:10:"access URL";}s:7:"comment";a:1:{s:3:"und";s:245:"points to the location of a distribution. This can be a direct download link, a link to an HTML page containing a link to the actual data, Feed, Web Service etc. the semantic is determined by its domain (Distribution, Feed, WebService, Download)";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:45:"https://www.w3.org/2000/01/rdf-schema#Resource";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"https://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"https://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"https://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"https://www.w3.org/ns/dcat#dataDictionary";a:7:{s:3:"uri";s:40:"https://www.w3.org/ns/dcat#dataDictionary";s:5:"label";a:1:{s:3:"und";s:15:"data dictionary";}s:7:"comment";a:1:{s:3:"und";s:64:"links a dataset to a dictionary that helps interpreting the data";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"https://www.w3.org/ns/dcat#dataQuality";a:7:{s:3:"uri";s:37:"https://www.w3.org/ns/dcat#dataQuality";s:5:"label";a:1:{s:3:"und";s:12:"data quality";}s:7:"comment";a:1:{s:3:"und";s:185:"describes the quality of data e.g. precision. This should not be used to describe the data collection characteristics, other more specialized statistical properties can be used instead.";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"https://www.w3.org/ns/dcat#dataset";a:7:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#dataset";s:5:"label";a:1:{s:3:"und";s:7:"dataset";}s:7:"comment";a:1:{s:3:"und";s:37:"a dataset that is part of the catalog";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"https://www.w3.org/ns/dcat#distribution";a:7:{s:3:"uri";s:38:"https://www.w3.org/ns/dcat#distribution";s:5:"label";a:1:{s:3:"und";s:12:"distribution";}s:7:"comment";a:1:{s:3:"und";s:56:"connects a dataset to one of its available distributions";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"https://www.w3.org/ns/dcat#granularity";a:7:{s:3:"uri";s:37:"https://www.w3.org/ns/dcat#granularity";s:5:"label";a:1:{s:3:"und";s:11:"granularity";}s:7:"comment";a:1:{s:3:"und";s:98:"describes the level of granularity of data in a dataset. The granularity can be in time, place etc";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Dataset";}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:33:"https://www.w3.org/ns/dcat#keyword";a:7:{s:3:"uri";s:33:"https://www.w3.org/ns/dcat#keyword";s:5:"label";a:1:{s:3:"und";s:7:"keyword";}s:7:"comment";a:1:{s:3:"und";s:38:"a keyword or tag describing the datase";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:32:"https://www.w3.org/ns/dcat#record";a:7:{s:3:"uri";s:32:"https://www.w3.org/ns/dcat#record";s:5:"label";a:1:{s:3:"und";s:6:"record";}s:7:"comment";a:1:{s:3:"und";s:30:"links a catalog to its records";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:39:"https://www.w3.org/ns/dcat#CatalogRecord";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:30:"https://www.w3.org/ns/dcat#size";a:7:{s:3:"uri";s:30:"https://www.w3.org/ns/dcat#size";s:5:"label";a:1:{s:3:"und";s:4:"size";}s:7:"comment";a:1:{s:3:"und";s:26:"the size of a distribution";}s:6:"domain";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:31:"http://purl.org/dc/terms/extent";}s:7:"inverse";a:0:{}}s:31:"https://www.w3.org/ns/dcat#theme";a:7:{s:3:"uri";s:31:"https://www.w3.org/ns/dcat#theme";s:5:"label";a:1:{s:3:"und";s:5:"theme";}s:7:"comment";a:1:{s:3:"und";s:68:"the main category of the dataset. A dataset can have multiple themes";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:43:"https://www.w3.org/2004/02/skos/core#Concept";}s:13:"superproperty";a:1:{i:0;s:32:"http://purl.org/dc/terms/subject";}s:7:"inverse";a:0:{}}s:39:"https://www.w3.org/ns/dcat#themeTaxonomy";a:7:{s:3:"uri";s:39:"https://www.w3.org/ns/dcat#themeTaxonomy";s:5:"label";a:1:{s:3:"und";s:6:"themes";}s:7:"comment";a:1:{s:3:"und";s:74:"the knowledge organization system (KOS) used to classify catalogs datasets";}s:6:"domain";a:1:{i:0;s:33:"https://www.w3.org/ns/dcat#Catalog";}s:5:"range";a:1:{i:0;s:49:"https://www.w3.org/2004/02/skos/core#ConceptScheme";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}s:21:"owl_property_datatype";a:1:{s:31:"https://www.w3.org/ns/dcat#bytes";a:7:{s:3:"uri";s:31:"https://www.w3.org/ns/dcat#bytes";s:5:"label";a:1:{s:3:"und";s:13:"size in bytes";}s:7:"comment";a:1:{s:3:"und";s:34:"describe size of resource in bytes";}s:6:"domain";a:1:{i:0;s:38:"https://www.w3.org/ns/dcat#Distribution";}s:5:"range";a:1:{i:0;s:40:"https://www.w3.org/2001/XMLSchema#integer";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:5:{s:3:"xml";s:36:"https://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"https://www.w3.org/1999/02/22-rdf-syntax-ns#";i:0;s:37:"https://www.w3.org/2000/01/rdf-schema#";s:3:"dct";s:25:"http://purl.org/dc/terms/";s:3:"owl";s:30:"https://www.w3.org/2002/07/owl#";}}'); -$dc = unserialize('a:5:{s:3:"uri";s:25:"http://purl.org/dc/terms/";s:5:"title";a:1:{s:2:"en";s:27:"DCMI Metadata Terms - other";}s:11:"description";a:0:{}s:5:"terms";a:2:{s:10:"rdfs_class";a:25:{s:30:"http://purl.org/dc/terms/Agent";a:5:{s:3:"uri";s:30:"http://purl.org/dc/terms/Agent";s:5:"label";a:1:{s:2:"en";s:5:"Agent";}s:7:"comment";a:1:{s:2:"en";s:45:"A resource that acts or has the power to act.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/AgentClass";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/AgentClass";s:5:"label";a:1:{s:2:"en";s:11:"Agent Class";}s:7:"comment";a:1:{s:2:"en";s:18:"A group of agents.";}s:10:"superclass";a:1:{i:0;s:42:"http://www.w3.org/2000/01/rdf-schema#Class";}s:8:"disjoint";a:0:{}}s:46:"http://purl.org/dc/terms/BibliographicResource";a:5:{s:3:"uri";s:46:"http://purl.org/dc/terms/BibliographicResource";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Resource";}s:7:"comment";a:1:{s:2:"en";s:47:"A book, article, or other documentary resource.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/FileFormat";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/FileFormat";s:5:"label";a:1:{s:2:"en";s:11:"File Format";}s:7:"comment";a:1:{s:2:"en";s:26:"A digital resource format.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/Frequency";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/Frequency";s:5:"label";a:1:{s:2:"en";s:9:"Frequency";}s:7:"comment";a:1:{s:2:"en";s:33:"A rate at which something recurs.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/Jurisdiction";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/Jurisdiction";s:5:"label";a:1:{s:2:"en";s:12:"Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:69:"The extent or range of judicial, law enforcement, or other authority.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/LicenseDocument";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/LicenseDocument";s:5:"label";a:1:{s:2:"en";s:16:"License Document";}s:7:"comment";a:1:{s:2:"en";s:76:"A legal document giving official permission to do something with a Resource.";}s:10:"superclass";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/LinguisticSystem";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/LinguisticSystem";s:5:"label";a:1:{s:2:"en";s:17:"Linguistic System";}s:7:"comment";a:1:{s:2:"en";s:77:"A system of signs, symbols, sounds, gestures, or rules used in communication.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Location";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Location";s:5:"label";a:1:{s:2:"en";s:8:"Location";}s:7:"comment";a:1:{s:2:"en";s:32:"A spatial region or named place.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";a:5:{s:3:"uri";s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";s:5:"label";a:1:{s:2:"en";s:33:"Location, Period, or Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:44:"A location, period of time, or jurisdiction.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/MediaType";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/MediaType";s:5:"label";a:1:{s:2:"en";s:10:"Media Type";}s:7:"comment";a:1:{s:2:"en";s:33:"A file format or physical medium.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";a:5:{s:3:"uri";s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";s:5:"label";a:1:{s:2:"en";s:20:"Media Type or Extent";}s:7:"comment";a:1:{s:2:"en";s:23:"A media type or extent.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/MethodOfInstruction";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/MethodOfInstruction";s:5:"label";a:1:{s:2:"en";s:21:"Method of Instruction";}s:7:"comment";a:1:{s:2:"en";s:68:"A process that is used to engender knowledge, attitudes, and skills.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/MethodOfAccrual";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/MethodOfAccrual";s:5:"label";a:1:{s:2:"en";s:17:"Method of Accrual";}s:7:"comment";a:1:{s:2:"en";s:54:"A method by which resources are added to a collection.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/PeriodOfTime";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/PeriodOfTime";s:5:"label";a:1:{s:2:"en";s:14:"Period of Time";}s:7:"comment";a:1:{s:2:"en";s:72:"An interval of time that is named or defined by its start and end dates.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/PhysicalMedium";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/PhysicalMedium";s:5:"label";a:1:{s:2:"en";s:15:"Physical Medium";}s:7:"comment";a:1:{s:2:"en";s:31:"A physical material or carrier.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/PhysicalResource";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/PhysicalResource";s:5:"label";a:1:{s:2:"en";s:17:"Physical Resource";}s:7:"comment";a:1:{s:2:"en";s:17:"A material thing.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:31:"http://purl.org/dc/terms/Policy";a:5:{s:3:"uri";s:31:"http://purl.org/dc/terms/Policy";s:5:"label";a:1:{s:2:"en";s:6:"Policy";}s:7:"comment";a:1:{s:2:"en";s:118:"A plan or course of action by an authority, intended to influence and determine decisions, actions, and other matters.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/ProvenanceStatement";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/ProvenanceStatement";s:5:"label";a:1:{s:2:"en";s:20:"Provenance Statement";}s:7:"comment";a:1:{s:2:"en";s:158:"A statement of any changes in ownership and custody of a resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/RightsStatement";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/RightsStatement";s:5:"label";a:1:{s:2:"en";s:16:"Rights Statement";}s:7:"comment";a:1:{s:2:"en";s:197:"A statement about the intellectual property rights (IPR) held in or over a Resource, a legal document giving official permission to do something with a resource, or a statement about access rights.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/SizeOrDuration";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/SizeOrDuration";s:5:"label";a:1:{s:2:"en";s:16:"Size or Duration";}s:7:"comment";a:1:{s:2:"en";s:58:"A dimension or extent, or a time taken to play or execute.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Standard";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Standard";s:5:"label";a:1:{s:2:"en";s:8:"Standard";}s:7:"comment";a:1:{s:2:"en";s:86:"A basis for comparison; a reference point against which other things can be evaluated.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:42:"http://www.w3.org/2000/01/rdf-schema#Class";a:5:{s:3:"uri";s:42:"http://www.w3.org/2000/01/rdf-schema#Class";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:38:"http://purl.org/dc/dcmitype/Collection";a:5:{s:3:"uri";s:38:"http://purl.org/dc/dcmitype/Collection";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:71:{s:30:"http://purl.org/dc/terms/title";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/title";s:5:"label";a:1:{s:2:"en";s:5:"Title";}s:7:"comment";a:1:{s:2:"en";s:29:"A name given to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/creator";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/creator";s:5:"label";a:1:{s:2:"en";s:7:"Creator";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity primarily responsible for making the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:2:{i:0;s:39:"http://purl.org/dc/elements/1.1/creator";i:1;s:36:"http://purl.org/dc/terms/contributor";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:1:{s:2:"en";s:7:"Subject";}s:7:"comment";a:1:{s:2:"en";s:26:"The topic of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:39:"http://purl.org/dc/elements/1.1/subject";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/description";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/description";s:5:"label";a:1:{s:2:"en";s:11:"Description";}s:7:"comment";a:1:{s:2:"en";s:27:"An account of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/publisher";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/publisher";s:5:"label";a:1:{s:2:"en";s:9:"Publisher";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity responsible for making the resource available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:41:"http://purl.org/dc/elements/1.1/publisher";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/contributor";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/contributor";s:5:"label";a:1:{s:2:"en";s:11:"Contributor";}s:7:"comment";a:1:{s:2:"en";s:63:"An entity responsible for making contributions to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/contributor";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/date";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/date";s:5:"label";a:1:{s:2:"en";s:4:"Date";}s:7:"comment";a:1:{s:2:"en";s:84:"A point or period of time associated with an event in the lifecycle of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/type";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/type";s:5:"label";a:1:{s:2:"en";s:4:"Type";}s:7:"comment";a:1:{s:2:"en";s:36:"The nature or genre of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"http://www.w3.org/2000/01/rdf-schema#Class";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/type";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/format";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/format";s:5:"label";a:1:{s:2:"en";s:6:"Format";}s:7:"comment";a:1:{s:2:"en";s:64:"The file format, physical medium, or dimensions of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/identifier";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/identifier";s:5:"label";a:1:{s:2:"en";s:10:"Identifier";}s:7:"comment";a:1:{s:2:"en";s:64:"An unambiguous reference to the resource within a given context.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/source";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/source";s:5:"label";a:1:{s:2:"en";s:6:"Source";}s:7:"comment";a:1:{s:2:"en";s:64:"A related resource from which the described resource is derived.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/source";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/language";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/language";s:5:"label";a:1:{s:2:"en";s:8:"Language";}s:7:"comment";a:1:{s:2:"en";s:27:"A language of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:41:"http://purl.org/dc/terms/LinguisticSystem";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/language";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/relation";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/relation";s:5:"label";a:1:{s:2:"en";s:8:"Relation";}s:7:"comment";a:1:{s:2:"en";s:19:"A related resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/coverage";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/coverage";s:5:"label";a:1:{s:2:"en";s:8:"Coverage";}s:7:"comment";a:1:{s:2:"en";s:147:"The spatial or temporal topic of the resource, the spatial applicability of the resource, or the jurisdiction under which the resource is relevant.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/rights";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/rights";s:5:"label";a:1:{s:2:"en";s:6:"Rights";}s:7:"comment";a:1:{s:2:"en";s:55:"Information about rights held in and over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/audience";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/audience";s:5:"label";a:1:{s:2:"en";s:8:"Audience";}s:7:"comment";a:1:{s:2:"en";s:62:"A class of entity for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/alternative";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/alternative";s:5:"label";a:1:{s:2:"en";s:17:"Alternative Title";}s:7:"comment";a:1:{s:2:"en";s:37:"An alternative name for the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";i:1;s:30:"http://purl.org/dc/terms/title";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/tableOfContents";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/tableOfContents";s:5:"label";a:1:{s:2:"en";s:17:"Table Of Contents";}s:7:"comment";a:1:{s:2:"en";s:35:"A list of subunits of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/abstract";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/abstract";s:5:"label";a:1:{s:2:"en";s:8:"Abstract";}s:7:"comment";a:1:{s:2:"en";s:26:"A summary of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/created";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/created";s:5:"label";a:1:{s:2:"en";s:12:"Date Created";}s:7:"comment";a:1:{s:2:"en";s:33:"Date of creation of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:30:"http://purl.org/dc/terms/valid";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/valid";s:5:"label";a:1:{s:2:"en";s:10:"Date Valid";}s:7:"comment";a:1:{s:2:"en";s:47:"Date (often a range) of validity of a resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/available";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/available";s:5:"label";a:1:{s:2:"en";s:14:"Date Available";}s:7:"comment";a:1:{s:2:"en";s:71:"Date (often a range) that the resource became or will become available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/issued";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/issued";s:5:"label";a:1:{s:2:"en";s:11:"Date Issued";}s:7:"comment";a:1:{s:2:"en";s:60:"Date of formal issuance (e.g., publication) of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/modified";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/modified";s:5:"label";a:1:{s:2:"en";s:13:"Date Modified";}s:7:"comment";a:1:{s:2:"en";s:39:"Date on which the resource was changed.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:1:{s:2:"en";s:6:"Extent";}s:7:"comment";a:1:{s:2:"en";s:37:"The size or duration of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/SizeOrDuration";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/medium";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/medium";s:5:"label";a:1:{s:2:"en";s:6:"Medium";}s:7:"comment";a:1:{s:2:"en";s:49:"The material or physical carrier of the resource.";}s:6:"domain";a:1:{i:0;s:41:"http://purl.org/dc/terms/PhysicalResource";}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/PhysicalMedium";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/isVersionOf";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/isVersionOf";s:5:"label";a:1:{s:2:"en";s:13:"Is Version Of";}s:7:"comment";a:1:{s:2:"en";s:88:"A related resource of which the described resource is a version, edition, or adaptation.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/hasVersion";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/hasVersion";s:5:"label";a:1:{s:2:"en";s:11:"Has Version";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource that is a version, edition, or adaptation of the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isReplacedBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isReplacedBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Replaced By";}s:7:"comment";a:1:{s:2:"en";s:83:"A related resource that supplants, displaces, or supersedes the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/replaces";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/replaces";s:5:"label";a:1:{s:2:"en";s:8:"Replaces";}s:7:"comment";a:1:{s:2:"en";s:90:"A related resource that is supplanted, displaced, or superseded by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isRequiredBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isRequiredBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Required By";}s:7:"comment";a:1:{s:2:"en";s:104:"A related resource that requires the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/requires";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/requires";s:5:"label";a:1:{s:2:"en";s:8:"Requires";}s:7:"comment";a:1:{s:2:"en";s:110:"A related resource that is required by the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/isPartOf";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/isPartOf";s:5:"label";a:1:{s:2:"en";s:10:"Is Part Of";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource in which the described resource is physically or logically included.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/hasPart";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/hasPart";s:5:"label";a:1:{s:2:"en";s:8:"Has Part";}s:7:"comment";a:1:{s:2:"en";s:93:"A related resource that is included either physically or logically in the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/isReferencedBy";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/isReferencedBy";s:5:"label";a:1:{s:2:"en";s:16:"Is Referenced By";}s:7:"comment";a:1:{s:2:"en";s:89:"A related resource that references, cites, or otherwise points to the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/references";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/references";s:5:"label";a:1:{s:2:"en";s:10:"References";}s:7:"comment";a:1:{s:2:"en";s:96:"A related resource that is referenced, cited, or otherwise pointed to by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/isFormatOf";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/isFormatOf";s:5:"label";a:1:{s:2:"en";s:12:"Is Format Of";}s:7:"comment";a:1:{s:2:"en";s:99:"A related resource that is substantially the same as the described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/hasFormat";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/hasFormat";s:5:"label";a:1:{s:2:"en";s:10:"Has Format";}s:7:"comment";a:1:{s:2:"en";s:112:"A related resource that is substantially the same as the pre-existing described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/conformsTo";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/conformsTo";s:5:"label";a:1:{s:2:"en";s:11:"Conforms To";}s:7:"comment";a:1:{s:2:"en";s:65:"An established standard to which the described resource conforms.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Standard";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/spatial";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/spatial";s:5:"label";a:1:{s:2:"en";s:16:"Spatial Coverage";}s:7:"comment";a:1:{s:2:"en";s:40:"Spatial characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Location";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/temporal";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/temporal";s:5:"label";a:1:{s:2:"en";s:17:"Temporal Coverage";}s:7:"comment";a:1:{s:2:"en";s:41:"Temporal characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:37:"http://purl.org/dc/terms/PeriodOfTime";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/mediator";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/mediator";s:5:"label";a:1:{s:2:"en";s:8:"Mediator";}s:7:"comment";a:1:{s:2:"en";s:95:"An entity that mediates access to the resource and for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/dateAccepted";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/dateAccepted";s:5:"label";a:1:{s:2:"en";s:13:"Date Accepted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of acceptance of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/dateCopyrighted";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/dateCopyrighted";s:5:"label";a:1:{s:2:"en";s:16:"Date Copyrighted";}s:7:"comment";a:1:{s:2:"en";s:18:"Date of copyright.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/dateSubmitted";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/dateSubmitted";s:5:"label";a:1:{s:2:"en";s:14:"Date Submitted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of submission of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/educationLevel";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/educationLevel";s:5:"label";a:1:{s:2:"en";s:24:"Audience Education Level";}s:7:"comment";a:1:{s:2:"en";s:140:"A class of entity, defined in terms of progression through an educational or training context, for which the described resource is intended.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/accessRights";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/accessRights";s:5:"label";a:1:{s:2:"en";s:13:"Access Rights";}s:7:"comment";a:1:{s:2:"en";s:86:"Information about who can access the resource or an indication of its security status.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:46:"http://purl.org/dc/terms/bibliographicCitation";a:7:{s:3:"uri";s:46:"http://purl.org/dc/terms/bibliographicCitation";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Citation";}s:7:"comment";a:1:{s:2:"en";s:43:"A bibliographic reference for the resource.";}s:6:"domain";a:1:{i:0;s:46:"http://purl.org/dc/terms/BibliographicResource";}s:5:"range";a:1:{i:0;s:44:"http://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";i:1;s:35:"http://purl.org/dc/terms/identifier";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/license";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/license";s:5:"label";a:1:{s:2:"en";s:7:"License";}s:7:"comment";a:1:{s:2:"en";s:78:"A legal document giving official permission to do something with the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/LicenseDocument";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/rightsHolder";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/rightsHolder";s:5:"label";a:1:{s:2:"en";s:13:"Rights Holder";}s:7:"comment";a:1:{s:2:"en";s:69:"A person or organization owning or managing rights over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/provenance";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/provenance";s:5:"label";a:1:{s:2:"en";s:10:"Provenance";}s:7:"comment";a:1:{s:2:"en";s:160:"A statement of any changes in ownership and custody of the resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/ProvenanceStatement";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:44:"http://purl.org/dc/terms/instructionalMethod";a:7:{s:3:"uri";s:44:"http://purl.org/dc/terms/instructionalMethod";s:5:"label";a:1:{s:2:"en";s:20:"Instructional Method";}s:7:"comment";a:1:{s:2:"en";s:112:"A process, used to engender knowledge, attitudes and skills, that the described resource is designed to support.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/MethodOfInstruction";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualMethod";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualMethod";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Method";}s:7:"comment";a:1:{s:2:"en";s:52:"The method by which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/MethodOfAccrual";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/terms/accrualPeriodicity";a:7:{s:3:"uri";s:43:"http://purl.org/dc/terms/accrualPeriodicity";s:5:"label";a:1:{s:2:"en";s:19:"Accrual Periodicity";}s:7:"comment";a:1:{s:2:"en";s:57:"The frequency with which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:34:"http://purl.org/dc/terms/Frequency";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualPolicy";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualPolicy";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Policy";}s:7:"comment";a:1:{s:2:"en";s:59:"The policy governing the addition of items to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:31:"http://purl.org/dc/terms/Policy";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/elements/1.1/title";a:7:{s:3:"uri";s:37:"http://purl.org/dc/elements/1.1/title";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/creator";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/creator";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/subject";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/description";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/description";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:41:"http://purl.org/dc/elements/1.1/publisher";a:7:{s:3:"uri";s:41:"http://purl.org/dc/elements/1.1/publisher";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/contributor";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/contributor";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/date";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/date";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/type";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/type";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/format";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/format";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:42:"http://purl.org/dc/elements/1.1/identifier";a:7:{s:3:"uri";s:42:"http://purl.org/dc/elements/1.1/identifier";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/source";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/source";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/language";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/language";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/relation";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/relation";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/coverage";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/coverage";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/rights";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/rights";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://xmlns.com/foaf/0.1/maker";a:7:{s:3:"uri";s:31:"http://xmlns.com/foaf/0.1/maker";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:7:{s:3:"xml";s:36:"http://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"http://www.w3.org/1999/02/22-rdf-syntax-ns#";s:3:"owl";s:30:"http://www.w3.org/2002/07/owl#";s:4:"skos";s:36:"http://www.w3.org/2004/02/skos/core#";s:4:"dcam";s:24:"http://purl.org/dc/dcam/";s:7:"dcterms";s:25:"http://purl.org/dc/terms/";s:4:"rdfs";s:37:"http://www.w3.org/2000/01/rdf-schema#";}}'); +$dc = unserialize('a:5:{s:3:"uri";s:25:"http://purl.org/dc/terms/";s:5:"title";a:1:{s:2:"en";s:27:"DCMI Metadata Terms - other";}s:11:"description";a:0:{}s:5:"terms";a:2:{s:10:"rdfs_class";a:25:{s:30:"http://purl.org/dc/terms/Agent";a:5:{s:3:"uri";s:30:"http://purl.org/dc/terms/Agent";s:5:"label";a:1:{s:2:"en";s:5:"Agent";}s:7:"comment";a:1:{s:2:"en";s:45:"A resource that acts or has the power to act.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/AgentClass";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/AgentClass";s:5:"label";a:1:{s:2:"en";s:11:"Agent Class";}s:7:"comment";a:1:{s:2:"en";s:18:"A group of agents.";}s:10:"superclass";a:1:{i:0;s:42:"https://www.w3.org/2000/01/rdf-schema#Class";}s:8:"disjoint";a:0:{}}s:46:"http://purl.org/dc/terms/BibliographicResource";a:5:{s:3:"uri";s:46:"http://purl.org/dc/terms/BibliographicResource";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Resource";}s:7:"comment";a:1:{s:2:"en";s:47:"A book, article, or other documentary resource.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:35:"http://purl.org/dc/terms/FileFormat";a:5:{s:3:"uri";s:35:"http://purl.org/dc/terms/FileFormat";s:5:"label";a:1:{s:2:"en";s:11:"File Format";}s:7:"comment";a:1:{s:2:"en";s:26:"A digital resource format.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/Frequency";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/Frequency";s:5:"label";a:1:{s:2:"en";s:9:"Frequency";}s:7:"comment";a:1:{s:2:"en";s:33:"A rate at which something recurs.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/Jurisdiction";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/Jurisdiction";s:5:"label";a:1:{s:2:"en";s:12:"Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:69:"The extent or range of judicial, law enforcement, or other authority.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/LicenseDocument";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/LicenseDocument";s:5:"label";a:1:{s:2:"en";s:16:"License Document";}s:7:"comment";a:1:{s:2:"en";s:76:"A legal document giving official permission to do something with a Resource.";}s:10:"superclass";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/LinguisticSystem";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/LinguisticSystem";s:5:"label";a:1:{s:2:"en";s:17:"Linguistic System";}s:7:"comment";a:1:{s:2:"en";s:77:"A system of signs, symbols, sounds, gestures, or rules used in communication.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Location";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Location";s:5:"label";a:1:{s:2:"en";s:8:"Location";}s:7:"comment";a:1:{s:2:"en";s:32:"A spatial region or named place.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";a:5:{s:3:"uri";s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";s:5:"label";a:1:{s:2:"en";s:33:"Location, Period, or Jurisdiction";}s:7:"comment";a:1:{s:2:"en";s:44:"A location, period of time, or jurisdiction.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:34:"http://purl.org/dc/terms/MediaType";a:5:{s:3:"uri";s:34:"http://purl.org/dc/terms/MediaType";s:5:"label";a:1:{s:2:"en";s:10:"Media Type";}s:7:"comment";a:1:{s:2:"en";s:33:"A file format or physical medium.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";a:5:{s:3:"uri";s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";s:5:"label";a:1:{s:2:"en";s:20:"Media Type or Extent";}s:7:"comment";a:1:{s:2:"en";s:23:"A media type or extent.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/MethodOfInstruction";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/MethodOfInstruction";s:5:"label";a:1:{s:2:"en";s:21:"Method of Instruction";}s:7:"comment";a:1:{s:2:"en";s:68:"A process that is used to engender knowledge, attitudes, and skills.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/MethodOfAccrual";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/MethodOfAccrual";s:5:"label";a:1:{s:2:"en";s:17:"Method of Accrual";}s:7:"comment";a:1:{s:2:"en";s:54:"A method by which resources are added to a collection.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:37:"http://purl.org/dc/terms/PeriodOfTime";a:5:{s:3:"uri";s:37:"http://purl.org/dc/terms/PeriodOfTime";s:5:"label";a:1:{s:2:"en";s:14:"Period of Time";}s:7:"comment";a:1:{s:2:"en";s:72:"An interval of time that is named or defined by its start and end dates.";}s:10:"superclass";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/PhysicalMedium";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/PhysicalMedium";s:5:"label";a:1:{s:2:"en";s:15:"Physical Medium";}s:7:"comment";a:1:{s:2:"en";s:31:"A physical material or carrier.";}s:10:"superclass";a:1:{i:0;s:34:"http://purl.org/dc/terms/MediaType";}s:8:"disjoint";a:0:{}}s:41:"http://purl.org/dc/terms/PhysicalResource";a:5:{s:3:"uri";s:41:"http://purl.org/dc/terms/PhysicalResource";s:5:"label";a:1:{s:2:"en";s:17:"Physical Resource";}s:7:"comment";a:1:{s:2:"en";s:17:"A material thing.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:31:"http://purl.org/dc/terms/Policy";a:5:{s:3:"uri";s:31:"http://purl.org/dc/terms/Policy";s:5:"label";a:1:{s:2:"en";s:6:"Policy";}s:7:"comment";a:1:{s:2:"en";s:118:"A plan or course of action by an authority, intended to influence and determine decisions, actions, and other matters.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"http://purl.org/dc/terms/ProvenanceStatement";a:5:{s:3:"uri";s:44:"http://purl.org/dc/terms/ProvenanceStatement";s:5:"label";a:1:{s:2:"en";s:20:"Provenance Statement";}s:7:"comment";a:1:{s:2:"en";s:158:"A statement of any changes in ownership and custody of a resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:40:"http://purl.org/dc/terms/RightsStatement";a:5:{s:3:"uri";s:40:"http://purl.org/dc/terms/RightsStatement";s:5:"label";a:1:{s:2:"en";s:16:"Rights Statement";}s:7:"comment";a:1:{s:2:"en";s:197:"A statement about the intellectual property rights (IPR) held in or over a Resource, a legal document giving official permission to do something with a resource, or a statement about access rights.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:39:"http://purl.org/dc/terms/SizeOrDuration";a:5:{s:3:"uri";s:39:"http://purl.org/dc/terms/SizeOrDuration";s:5:"label";a:1:{s:2:"en";s:16:"Size or Duration";}s:7:"comment";a:1:{s:2:"en";s:58:"A dimension or extent, or a time taken to play or execute.";}s:10:"superclass";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:8:"disjoint";a:0:{}}s:33:"http://purl.org/dc/terms/Standard";a:5:{s:3:"uri";s:33:"http://purl.org/dc/terms/Standard";s:5:"label";a:1:{s:2:"en";s:8:"Standard";}s:7:"comment";a:1:{s:2:"en";s:86:"A basis for comparison; a reference point against which other things can be evaluated.";}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:42:"https://www.w3.org/2000/01/rdf-schema#Class";a:5:{s:3:"uri";s:42:"https://www.w3.org/2000/01/rdf-schema#Class";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:38:"http://purl.org/dc/dcmitype/Collection";a:5:{s:3:"uri";s:38:"http://purl.org/dc/dcmitype/Collection";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";a:5:{s:3:"uri";s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:10:"superclass";a:0:{}s:8:"disjoint";a:0:{}}}s:12:"rdf_property";a:71:{s:30:"http://purl.org/dc/terms/title";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/title";s:5:"label";a:1:{s:2:"en";s:5:"Title";}s:7:"comment";a:1:{s:2:"en";s:29:"A name given to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/creator";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/creator";s:5:"label";a:1:{s:2:"en";s:7:"Creator";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity primarily responsible for making the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:2:{i:0;s:39:"http://purl.org/dc/elements/1.1/creator";i:1;s:36:"http://purl.org/dc/terms/contributor";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/subject";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/subject";s:5:"label";a:1:{s:2:"en";s:7:"Subject";}s:7:"comment";a:1:{s:2:"en";s:26:"The topic of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:39:"http://purl.org/dc/elements/1.1/subject";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/description";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/description";s:5:"label";a:1:{s:2:"en";s:11:"Description";}s:7:"comment";a:1:{s:2:"en";s:27:"An account of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/publisher";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/publisher";s:5:"label";a:1:{s:2:"en";s:9:"Publisher";}s:7:"comment";a:1:{s:2:"en";s:56:"An entity responsible for making the resource available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:41:"http://purl.org/dc/elements/1.1/publisher";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/contributor";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/contributor";s:5:"label";a:1:{s:2:"en";s:11:"Contributor";}s:7:"comment";a:1:{s:2:"en";s:63:"An entity responsible for making contributions to the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:1:{i:0;s:43:"http://purl.org/dc/elements/1.1/contributor";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/date";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/date";s:5:"label";a:1:{s:2:"en";s:4:"Date";}s:7:"comment";a:1:{s:2:"en";s:84:"A point or period of time associated with an event in the lifecycle of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";}s:7:"inverse";a:0:{}}s:29:"http://purl.org/dc/terms/type";a:7:{s:3:"uri";s:29:"http://purl.org/dc/terms/type";s:5:"label";a:1:{s:2:"en";s:4:"Type";}s:7:"comment";a:1:{s:2:"en";s:36:"The nature or genre of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"https://www.w3.org/2000/01/rdf-schema#Class";}s:13:"superproperty";a:1:{i:0;s:36:"http://purl.org/dc/elements/1.1/type";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/format";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/format";s:5:"label";a:1:{s:2:"en";s:6:"Format";}s:7:"comment";a:1:{s:2:"en";s:64:"The file format, physical medium, or dimensions of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:42:"http://purl.org/dc/terms/MediaTypeOrExtent";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/identifier";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/identifier";s:5:"label";a:1:{s:2:"en";s:10:"Identifier";}s:7:"comment";a:1:{s:2:"en";s:64:"An unambiguous reference to the resource within a given context.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:1:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/source";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/source";s:5:"label";a:1:{s:2:"en";s:6:"Source";}s:7:"comment";a:1:{s:2:"en";s:64:"A related resource from which the described resource is derived.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/source";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/language";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/language";s:5:"label";a:1:{s:2:"en";s:8:"Language";}s:7:"comment";a:1:{s:2:"en";s:27:"A language of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:41:"http://purl.org/dc/terms/LinguisticSystem";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/language";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/relation";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/relation";s:5:"label";a:1:{s:2:"en";s:8:"Relation";}s:7:"comment";a:1:{s:2:"en";s:19:"A related resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/coverage";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/coverage";s:5:"label";a:1:{s:2:"en";s:8:"Coverage";}s:7:"comment";a:1:{s:2:"en";s:147:"The spatial or temporal topic of the resource, the spatial applicability of the resource, or the jurisdiction under which the resource is relevant.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:53:"http://purl.org/dc/terms/LocationPeriodOrJurisdiction";}s:13:"superproperty";a:1:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/rights";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/rights";s:5:"label";a:1:{s:2:"en";s:6:"Rights";}s:7:"comment";a:1:{s:2:"en";s:55:"Information about rights held in and over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:1:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/audience";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/audience";s:5:"label";a:1:{s:2:"en";s:8:"Audience";}s:7:"comment";a:1:{s:2:"en";s:62:"A class of entity for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/alternative";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/alternative";s:5:"label";a:1:{s:2:"en";s:17:"Alternative Title";}s:7:"comment";a:1:{s:2:"en";s:37:"An alternative name for the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:37:"http://purl.org/dc/elements/1.1/title";i:1;s:30:"http://purl.org/dc/terms/title";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/tableOfContents";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/tableOfContents";s:5:"label";a:1:{s:2:"en";s:17:"Table Of Contents";}s:7:"comment";a:1:{s:2:"en";s:35:"A list of subunits of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/abstract";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/abstract";s:5:"label";a:1:{s:2:"en";s:8:"Abstract";}s:7:"comment";a:1:{s:2:"en";s:26:"A summary of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:43:"http://purl.org/dc/elements/1.1/description";i:1;s:36:"http://purl.org/dc/terms/description";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/created";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/created";s:5:"label";a:1:{s:2:"en";s:12:"Date Created";}s:7:"comment";a:1:{s:2:"en";s:33:"Date of creation of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:30:"http://purl.org/dc/terms/valid";a:7:{s:3:"uri";s:30:"http://purl.org/dc/terms/valid";s:5:"label";a:1:{s:2:"en";s:10:"Date Valid";}s:7:"comment";a:1:{s:2:"en";s:47:"Date (often a range) of validity of a resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/available";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/available";s:5:"label";a:1:{s:2:"en";s:14:"Date Available";}s:7:"comment";a:1:{s:2:"en";s:71:"Date (often a range) that the resource became or will become available.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/issued";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/issued";s:5:"label";a:1:{s:2:"en";s:11:"Date Issued";}s:7:"comment";a:1:{s:2:"en";s:60:"Date of formal issuance (e.g., publication) of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/modified";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/modified";s:5:"label";a:1:{s:2:"en";s:13:"Date Modified";}s:7:"comment";a:1:{s:2:"en";s:39:"Date on which the resource was changed.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/extent";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/extent";s:5:"label";a:1:{s:2:"en";s:6:"Extent";}s:7:"comment";a:1:{s:2:"en";s:37:"The size or duration of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/SizeOrDuration";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:31:"http://purl.org/dc/terms/medium";a:7:{s:3:"uri";s:31:"http://purl.org/dc/terms/medium";s:5:"label";a:1:{s:2:"en";s:6:"Medium";}s:7:"comment";a:1:{s:2:"en";s:49:"The material or physical carrier of the resource.";}s:6:"domain";a:1:{i:0;s:41:"http://purl.org/dc/terms/PhysicalResource";}s:5:"range";a:1:{i:0;s:39:"http://purl.org/dc/terms/PhysicalMedium";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/format";i:1;s:31:"http://purl.org/dc/terms/format";}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/terms/isVersionOf";a:7:{s:3:"uri";s:36:"http://purl.org/dc/terms/isVersionOf";s:5:"label";a:1:{s:2:"en";s:13:"Is Version Of";}s:7:"comment";a:1:{s:2:"en";s:88:"A related resource of which the described resource is a version, edition, or adaptation.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/hasVersion";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/hasVersion";s:5:"label";a:1:{s:2:"en";s:11:"Has Version";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource that is a version, edition, or adaptation of the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isReplacedBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isReplacedBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Replaced By";}s:7:"comment";a:1:{s:2:"en";s:83:"A related resource that supplants, displaces, or supersedes the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/replaces";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/replaces";s:5:"label";a:1:{s:2:"en";s:8:"Replaces";}s:7:"comment";a:1:{s:2:"en";s:90:"A related resource that is supplanted, displaced, or superseded by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/isRequiredBy";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/isRequiredBy";s:5:"label";a:1:{s:2:"en";s:14:"Is Required By";}s:7:"comment";a:1:{s:2:"en";s:104:"A related resource that requires the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/requires";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/requires";s:5:"label";a:1:{s:2:"en";s:8:"Requires";}s:7:"comment";a:1:{s:2:"en";s:110:"A related resource that is required by the described resource to support its function, delivery, or coherence.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/isPartOf";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/isPartOf";s:5:"label";a:1:{s:2:"en";s:10:"Is Part Of";}s:7:"comment";a:1:{s:2:"en";s:87:"A related resource in which the described resource is physically or logically included.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/hasPart";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/hasPart";s:5:"label";a:1:{s:2:"en";s:8:"Has Part";}s:7:"comment";a:1:{s:2:"en";s:93:"A related resource that is included either physically or logically in the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/isReferencedBy";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/isReferencedBy";s:5:"label";a:1:{s:2:"en";s:16:"Is Referenced By";}s:7:"comment";a:1:{s:2:"en";s:89:"A related resource that references, cites, or otherwise points to the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/references";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/references";s:5:"label";a:1:{s:2:"en";s:10:"References";}s:7:"comment";a:1:{s:2:"en";s:96:"A related resource that is referenced, cited, or otherwise pointed to by the described resource.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/isFormatOf";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/isFormatOf";s:5:"label";a:1:{s:2:"en";s:12:"Is Format Of";}s:7:"comment";a:1:{s:2:"en";s:99:"A related resource that is substantially the same as the described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:34:"http://purl.org/dc/terms/hasFormat";a:7:{s:3:"uri";s:34:"http://purl.org/dc/terms/hasFormat";s:5:"label";a:1:{s:2:"en";s:10:"Has Format";}s:7:"comment";a:1:{s:2:"en";s:112:"A related resource that is substantially the same as the pre-existing described resource, but in another format.";}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/conformsTo";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/conformsTo";s:5:"label";a:1:{s:2:"en";s:11:"Conforms To";}s:7:"comment";a:1:{s:2:"en";s:65:"An established standard to which the described resource conforms.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Standard";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/relation";i:1;s:33:"http://purl.org/dc/terms/relation";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/spatial";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/spatial";s:5:"label";a:1:{s:2:"en";s:16:"Spatial Coverage";}s:7:"comment";a:1:{s:2:"en";s:40:"Spatial characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:33:"http://purl.org/dc/terms/Location";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/temporal";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/temporal";s:5:"label";a:1:{s:2:"en";s:17:"Temporal Coverage";}s:7:"comment";a:1:{s:2:"en";s:41:"Temporal characteristics of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:37:"http://purl.org/dc/terms/PeriodOfTime";}s:13:"superproperty";a:2:{i:0;s:40:"http://purl.org/dc/elements/1.1/coverage";i:1;s:33:"http://purl.org/dc/terms/coverage";}s:7:"inverse";a:0:{}}s:33:"http://purl.org/dc/terms/mediator";a:7:{s:3:"uri";s:33:"http://purl.org/dc/terms/mediator";s:5:"label";a:1:{s:2:"en";s:8:"Mediator";}s:7:"comment";a:1:{s:2:"en";s:95:"An entity that mediates access to the resource and for whom the resource is intended or useful.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/dateAccepted";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/dateAccepted";s:5:"label";a:1:{s:2:"en";s:13:"Date Accepted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of acceptance of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/terms/dateCopyrighted";a:7:{s:3:"uri";s:40:"http://purl.org/dc/terms/dateCopyrighted";s:5:"label";a:1:{s:2:"en";s:16:"Date Copyrighted";}s:7:"comment";a:1:{s:2:"en";s:18:"Date of copyright.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/dateSubmitted";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/dateSubmitted";s:5:"label";a:1:{s:2:"en";s:14:"Date Submitted";}s:7:"comment";a:1:{s:2:"en";s:35:"Date of submission of the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:36:"http://purl.org/dc/elements/1.1/date";i:1;s:29:"http://purl.org/dc/terms/date";}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/terms/educationLevel";a:7:{s:3:"uri";s:39:"http://purl.org/dc/terms/educationLevel";s:5:"label";a:1:{s:2:"en";s:24:"Audience Education Level";}s:7:"comment";a:1:{s:2:"en";s:140:"A class of entity, defined in terms of progression through an educational or training context, for which the described resource is intended.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:35:"http://purl.org/dc/terms/AgentClass";}s:13:"superproperty";a:1:{i:0;s:33:"http://purl.org/dc/terms/audience";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/accessRights";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/accessRights";s:5:"label";a:1:{s:2:"en";s:13:"Access Rights";}s:7:"comment";a:1:{s:2:"en";s:86:"Information about who can access the resource or an indication of its security status.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/RightsStatement";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:46:"http://purl.org/dc/terms/bibliographicCitation";a:7:{s:3:"uri";s:46:"http://purl.org/dc/terms/bibliographicCitation";s:5:"label";a:1:{s:2:"en";s:22:"Bibliographic Citation";}s:7:"comment";a:1:{s:2:"en";s:43:"A bibliographic reference for the resource.";}s:6:"domain";a:1:{i:0;s:46:"http://purl.org/dc/terms/BibliographicResource";}s:5:"range";a:1:{i:0;s:44:"https://www.w3.org/2000/01/rdf-schema#Literal";}s:13:"superproperty";a:2:{i:0;s:42:"http://purl.org/dc/elements/1.1/identifier";i:1;s:35:"http://purl.org/dc/terms/identifier";}s:7:"inverse";a:0:{}}s:32:"http://purl.org/dc/terms/license";a:7:{s:3:"uri";s:32:"http://purl.org/dc/terms/license";s:5:"label";a:1:{s:2:"en";s:7:"License";}s:7:"comment";a:1:{s:2:"en";s:78:"A legal document giving official permission to do something with the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/LicenseDocument";}s:13:"superproperty";a:2:{i:0;s:38:"http://purl.org/dc/elements/1.1/rights";i:1;s:31:"http://purl.org/dc/terms/rights";}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/terms/rightsHolder";a:7:{s:3:"uri";s:37:"http://purl.org/dc/terms/rightsHolder";s:5:"label";a:1:{s:2:"en";s:13:"Rights Holder";}s:7:"comment";a:1:{s:2:"en";s:69:"A person or organization owning or managing rights over the resource.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:30:"http://purl.org/dc/terms/Agent";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:35:"http://purl.org/dc/terms/provenance";a:7:{s:3:"uri";s:35:"http://purl.org/dc/terms/provenance";s:5:"label";a:1:{s:2:"en";s:10:"Provenance";}s:7:"comment";a:1:{s:2:"en";s:160:"A statement of any changes in ownership and custody of the resource since its creation that are significant for its authenticity, integrity, and interpretation.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/ProvenanceStatement";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:44:"http://purl.org/dc/terms/instructionalMethod";a:7:{s:3:"uri";s:44:"http://purl.org/dc/terms/instructionalMethod";s:5:"label";a:1:{s:2:"en";s:20:"Instructional Method";}s:7:"comment";a:1:{s:2:"en";s:112:"A process, used to engender knowledge, attitudes and skills, that the described resource is designed to support.";}s:6:"domain";a:0:{}s:5:"range";a:1:{i:0;s:44:"http://purl.org/dc/terms/MethodOfInstruction";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualMethod";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualMethod";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Method";}s:7:"comment";a:1:{s:2:"en";s:52:"The method by which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:40:"http://purl.org/dc/terms/MethodOfAccrual";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/terms/accrualPeriodicity";a:7:{s:3:"uri";s:43:"http://purl.org/dc/terms/accrualPeriodicity";s:5:"label";a:1:{s:2:"en";s:19:"Accrual Periodicity";}s:7:"comment";a:1:{s:2:"en";s:57:"The frequency with which items are added to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:34:"http://purl.org/dc/terms/Frequency";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/terms/accrualPolicy";a:7:{s:3:"uri";s:38:"http://purl.org/dc/terms/accrualPolicy";s:5:"label";a:1:{s:2:"en";s:14:"Accrual Policy";}s:7:"comment";a:1:{s:2:"en";s:59:"The policy governing the addition of items to a collection.";}s:6:"domain";a:1:{i:0;s:38:"http://purl.org/dc/dcmitype/Collection";}s:5:"range";a:1:{i:0;s:31:"http://purl.org/dc/terms/Policy";}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:37:"http://purl.org/dc/elements/1.1/title";a:7:{s:3:"uri";s:37:"http://purl.org/dc/elements/1.1/title";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/creator";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/creator";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:39:"http://purl.org/dc/elements/1.1/subject";a:7:{s:3:"uri";s:39:"http://purl.org/dc/elements/1.1/subject";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/description";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/description";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:41:"http://purl.org/dc/elements/1.1/publisher";a:7:{s:3:"uri";s:41:"http://purl.org/dc/elements/1.1/publisher";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:43:"http://purl.org/dc/elements/1.1/contributor";a:7:{s:3:"uri";s:43:"http://purl.org/dc/elements/1.1/contributor";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/date";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/date";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:36:"http://purl.org/dc/elements/1.1/type";a:7:{s:3:"uri";s:36:"http://purl.org/dc/elements/1.1/type";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/format";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/format";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:42:"http://purl.org/dc/elements/1.1/identifier";a:7:{s:3:"uri";s:42:"http://purl.org/dc/elements/1.1/identifier";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/source";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/source";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/language";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/language";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/relation";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/relation";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:40:"http://purl.org/dc/elements/1.1/coverage";a:7:{s:3:"uri";s:40:"http://purl.org/dc/elements/1.1/coverage";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:38:"http://purl.org/dc/elements/1.1/rights";a:7:{s:3:"uri";s:38:"http://purl.org/dc/elements/1.1/rights";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}s:31:"http://xmlns.com/foaf/0.1/maker";a:7:{s:3:"uri";s:31:"http://xmlns.com/foaf/0.1/maker";s:5:"label";a:0:{}s:7:"comment";a:0:{}s:6:"domain";a:0:{}s:5:"range";a:0:{}s:13:"superproperty";a:0:{}s:7:"inverse";a:0:{}}}}s:10:"namespaces";a:7:{s:3:"xml";s:36:"https://www.w3.org/XML/1998/namespace";s:3:"rdf";s:43:"https://www.w3.org/1999/02/22-rdf-syntax-ns#";s:3:"owl";s:30:"https://www.w3.org/2002/07/owl#";s:4:"skos";s:36:"https://www.w3.org/2004/02/skos/core#";s:4:"dcam";s:24:"http://purl.org/dc/dcam/";s:7:"dcterms";s:25:"http://purl.org/dc/terms/";s:4:"rdfs";s:37:"https://www.w3.org/2000/01/rdf-schema#";}}'); diff --git a/dkan/modules/dkan/dkan_dataset/includes/getRemoteFileInfoExample.php b/dkan/modules/dkan/dkan_dataset/includes/getRemoteFileInfoExample.php index b58af6013..498ebb2a5 100644 --- a/dkan/modules/dkan/dkan_dataset/includes/getRemoteFileInfoExample.php +++ b/dkan/modules/dkan/dkan_dataset/includes/getRemoteFileInfoExample.php @@ -9,7 +9,7 @@ include_once 'getRemoteFileInfo.php'; -$url = 'http://www.nd.gov/gis/apps/NDHUB.TraumaCenters.csv'; +$url = 'https://www.nd.gov/gis/apps/NDHUB.TraumaCenters.csv'; $file_info = new GetRemoteFileInfo($url, 'test'); var_dump($file_info->getType()); diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.features.field_instance.inc b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.features.field_instance.inc index c948d39b6..9196fc6be 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.features.field_instance.inc +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.features.field_instance.inc @@ -288,7 +288,7 @@ function dkan_dataset_content_types_field_default_field_instances() { 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'Contact person’s email address. See <a href="http://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.', + 'description' => 'Contact person’s email address. See <a href="https://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -335,7 +335,7 @@ function dkan_dataset_content_types_field_default_field_instances() { 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'Contact person’s name for the asset. See <a href="http://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info. Name should be formatted as Last, First.', + 'description' => 'Contact person’s name for the asset. See <a href="https://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info. Name should be formatted as Last, First.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -383,7 +383,7 @@ function dkan_dataset_content_types_field_default_field_instances() { 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'Provides some sort of description that helps understanding the data. This can be a URL to such a resource. See Project Open Data <a href="http://project-open-data.github.io/schema/#common-core-required-if-applicable-fields">data dictionary</a> for more info.', + 'description' => 'Provides some sort of description that helps understanding the data. This can be a URL to such a resource. See Project Open Data <a href="https://project-open-data.github.io/schema/#common-core-required-if-applicable-fields">data dictionary</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -476,7 +476,7 @@ function dkan_dataset_content_types_field_default_field_instances() { 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'The frequency with which dataset is published.See <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_frequency">DCAT frequency</a> for more info.', + 'description' => 'The frequency with which dataset is published.See <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_frequency">DCAT frequency</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -522,7 +522,7 @@ function dkan_dataset_content_types_field_default_field_instances() { 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'This is usually geographical or temporal but can also be other dimension e.g. Person can be used to describe granularity of a dataset about average income. See <a href="http://project-open-data.github.io/schema/#expanded-fields">DCAT Granularity</a> for more info.', + 'description' => 'This is usually geographical or temporal but can also be other dimension e.g. Person can be used to describe granularity of a dataset about average income. See <a href="https://project-open-data.github.io/schema/#expanded-fields">DCAT Granularity</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -1000,7 +1000,7 @@ uk-ogl|UK Open Government Licence (OGL)', ), ), 'deleted' => 0, - 'description' => 'The degree to which this dataset <em>could</em> be made publicly-available, regardless of whether it has been made available. See <a href="http://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.', + 'description' => 'The degree to which this dataset <em>could</em> be made publicly-available, regardless of whether it has been made available. See <a href="https://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -1201,7 +1201,7 @@ uk-ogl|UK Open Government Licence (OGL)', 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'Spatial coverage of the dataset. Will be rendered as GeoJSON. See DCAT <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.', + 'description' => 'Spatial coverage of the dataset. Will be rendered as GeoJSON. See DCAT <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -1255,7 +1255,7 @@ uk-ogl|UK Open Government Licence (OGL)', ), 'map' => array( 'auto_center' => 1, - 'base_url' => 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'base_url' => 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', 'center' => array( 'lat' => 43, 'lng' => -89, @@ -1274,7 +1274,7 @@ uk-ogl|UK Open Government Licence (OGL)', 'bundle' => 'dataset', 'default_value' => NULL, 'deleted' => 0, - 'description' => 'Spatial location of the dataset. Could be Address, City, State, part of the world or other description. See DCAT <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.', + 'description' => 'Spatial location of the dataset. Could be Address, City, State, part of the world or other description. See DCAT <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -1369,7 +1369,7 @@ uk-ogl|UK Open Government Licence (OGL)', $field_instances['node-dataset-field_temporal_coverage'] = array( 'bundle' => 'dataset', 'deleted' => 0, - 'description' => 'The temporal period that the dataset covers. See DCAT <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_temporal">temporal coverage</a> for more info.', + 'description' => 'The temporal period that the dataset covers. See DCAT <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_temporal">temporal coverage</a> for more info.', 'display' => array( 'default' => array( 'label' => 'hidden', @@ -1842,8 +1842,8 @@ uk-ogl|UK Open Government Licence (OGL)', t('Author'); t('Contact Email'); t('Contact Name'); - t('Contact person’s email address. See <a href="http://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.'); - t('Contact person’s name for the asset. See <a href="http://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info. Name should be formatted as Last, First.'); + t('Contact person’s email address. See <a href="https://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.'); + t('Contact person’s name for the asset. See <a href="https://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info. Name should be formatted as Last, First.'); t('Data Dictionary'); t('Data Dictionary Type'); t('Data Standard'); @@ -1865,26 +1865,26 @@ uk-ogl|UK Open Government Licence (OGL)', t('Link API'); t('Link File'); t('POD Theme'); - t('Provides some sort of description that helps understanding the data. This usually consists of a table providing explanation of columns meaning, values interpretation and acronyms/codes used in the data. Can be a URL to such a resource. See Project Open Data <a href="http://project-open-data.github.io/schema/#common-core-required-if-applicable-fields">data dictionary</a> for more info.'); + t('Provides some sort of description that helps understanding the data. This usually consists of a table providing explanation of columns meaning, values interpretation and acronyms/codes used in the data. Can be a URL to such a resource. See Project Open Data <a href="https://project-open-data.github.io/schema/#common-core-required-if-applicable-fields">data dictionary</a> for more info.'); t('Public Access Level'); t('Related Content'); t('Resources'); t('Rights'); t('Spatial / Geographical Coverage Area'); t('Spatial / Geographical Coverage Location'); - t('Spatial coverage of the dataset. Will be rendered as GeoJSON. See DCAT <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.'); - t('Spatial location of the dataset. Could be Address, City, State, part of the world or other description. See DCAT <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.'); + t('Spatial coverage of the dataset. Will be rendered as GeoJSON. See DCAT <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.'); + t('Spatial location of the dataset. Could be Address, City, State, part of the world or other description. See DCAT <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_spatial">spatial/geographical coverage</a> for more info.'); t('Tags'); t('Temporal Coverage'); - t('The degree to which this dataset <em>could</em> be made publicly-available, regardless of whether it has been made available. See <a href="http://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.'); - t('The frequency with which dataset is published.See <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_frequency">DCAT frequency</a> for more info.'); - t('The temporal period that the dataset covers. See DCAT <a href="http://www.w3.org/TR/vocab-dcat/#Property:dataset_temporal">temporal coverage</a> for more info.'); + t('The degree to which this dataset <em>could</em> be made publicly-available, regardless of whether it has been made available. See <a href="https://project-open-data.github.io/schema/#common-core-required-fields">Project Open Data</a> for more info.'); + t('The frequency with which dataset is published.See <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_frequency">DCAT frequency</a> for more info.'); + t('The temporal period that the dataset covers. See DCAT <a href="https://www.w3.org/TR/vocab-dcat/#Property:dataset_temporal">temporal coverage</a> for more info.'); t('This field allows the grouping of multiple datasets into a “collection”. This field should be employed by the individual datasets that together make up a collection. The value for this field should match the identifier of the parent dataset.'); t('This field is not intended for an agency’s homepage (e.g. www.agency.gov), but rather if a dataset has a human-friendly hub or landing page that users can be directed to for all resources tied to the dataset.'); t('This is the author of the dataset.'); t('This is used to identify a standardized specification the dataset conforms to. If this is a technical specification associated with a particular serialization of a distribution, this should be specified with <a href="#distribution-conformsTo">conformsTo</a> at the distribution level. It’s recommended that this be a URI that serves as a unique identifier for the standard. The URI may or may not also be a URL that provides documentation of the specification. See <a href="https://project-open-data.cio.gov/v1.1/schema/#dataset-conformsTo">Data Standard at Project Open Data</a>.'); t('This is used to identify the media type (IANA Media Type also known as MIME Type) of the URL used for the dataset’s describedBy field. This should be specified if describedBy is not an HTML webpage.'); - t('This is usually geographical or temporal but can also be other dimension e.g. Person can be used to describe granularity of a dataset about average income. See <a href="http://project-open-data.github.io/schema/#expanded-fields">DCAT Granularity</a> for more info.'); + t('This is usually geographical or temporal but can also be other dimension e.g. Person can be used to describe granularity of a dataset about average income. See <a href="https://project-open-data.github.io/schema/#expanded-fields">DCAT Granularity</a> for more info.'); t('This should adhere to the RFC 5646 standard. This language subtag lookup provides a good tool for checking and verifying language codes. A language tag is comprised of either one or two parts, the language subtag (such as en for English, sp for Spanish, wo for Wolof) and the regional subtag (such as US for United States, GB for Great Britain, MX for Mexico), separated by a hyphen. Regional subtags should only be provided when needed to distinguish a language tag from another one (such as American vs. British English).'); t('Upload'); diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.field_group.inc b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.field_group.inc index a0f559180..4e971385e 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.field_group.inc +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.field_group.inc @@ -1,4 +1,5 @@ <?php + /** * @file * dkan_dataset_content_types.field_group.inc @@ -51,7 +52,7 @@ function dkan_dataset_content_types_field_group_info() { 'label' => 'Dataset Info', 'instance_settings' => array( 'label' => 'hide', - 'desc' => '<div class="fieldset-description"><i class="icon-large icon-info-sign"></i>These fields are compatible with <a href="http://www.w3.org/TR/vocab-dcat/">DCAT</a>, an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web.</div>', + 'desc' => '<div class="fieldset-description"><i class="icon-large icon-info-sign"></i>These fields are compatible with <a href="https://www.w3.org/TR/vocab-dcat/">DCAT</a>, an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web.</div>', 'first_column' => 'Field', 'second_column' => 'Value', 'cells' => 'empty', @@ -103,7 +104,7 @@ function dkan_dataset_content_types_field_group_info() { 'instance_settings' => array( 'required_fields' => 1, 'classes' => ' group-additional field-group-fieldset', - 'description' => '<i class="icon-large icon-info-sign"></i>These fields are compatible with <a href="http://www.w3.org/TR/vocab-dcat/">DCAT</a>, an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web. These fields are also compatible with the Common Core metadata schema from <a href="http://project-open-data.github.io/schema/">Project Open Data</a>.', + 'description' => '<i class="icon-large icon-info-sign"></i>These fields are compatible with <a href="https://www.w3.org/TR/vocab-dcat/">DCAT</a>, an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web. These fields are also compatible with the Common Core metadata schema from <a href="https://project-open-data.github.io/schema/">Project Open Data</a>.', ), 'formatter' => 'open', ), diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_groups/dkan_dataset_groups.module b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_groups/dkan_dataset_groups.module index 78141cb32..c7be2e844 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_groups/dkan_dataset_groups.module +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_groups/dkan_dataset_groups.module @@ -85,7 +85,7 @@ function dkan_dataset_groups_block_view_alter(&$data, $block) { * Create a formatted 'Subscribe' link for this group. * * @TODO - * Replace with helper function if http://drupal.org/node/1568858 gets in. + * Replace with helper function if https://drupal.org/node/1568858 gets in. */ function dkan_dataset_groups_extras_subscribe($entity_type, $entity) { $display['type'] = 'og_group_subscribe'; @@ -320,7 +320,7 @@ function dkan_dataset_groups_get_og_rid_by_name($name) { * Implements hook_og_membership_insert(). */ function dkan_dataset_groups_og_membership_insert(OgMembership $og_membership) { - + // If the user is an editor, assign the og administrator role // when adding the user to a group. $group_type = $og_membership->group_type; @@ -332,7 +332,7 @@ function dkan_dataset_groups_og_membership_insert(OgMembership $og_membership) { $user = user_load($uid); // Get 'editor' role ID. $erid = user_role_load_by_name('editor'); - // If the user is an 'editor' then process it to assign it the + // If the user is an 'editor' then process it to assign it the // OG administrator role. if (user_has_role($erid->rid, $user)) { // Get the existing OG roles that the user has on the group. @@ -363,7 +363,7 @@ function dkan_dataset_groups_og_membership_insert(OgMembership $og_membership) { * Implements hook_user_update(). */ function dkan_dataset_groups_user_update(&$edit, $account, $category) { - + // OG roles are checked every time a user is updated. If the user is an 'editor' // then the 'administrator member' OG role is granted. If the user is not an 'editor' and // also not a 'site manager' then the 'administrator member' OG role is removed. @@ -399,7 +399,7 @@ function dkan_dataset_groups_user_update(&$edit, $account, $category) { } } - // Remove the 'administrator member' role from the user on all the groups. + // Remove the 'administrator member' role from the user on all the groups. db_delete('og_users_roles') ->condition('uid', $account->uid) ->condition('rid', $rid) @@ -443,7 +443,7 @@ function dkan_dataset_groups_user_update(&$edit, $account, $category) { )) ->execute(); - // Display a message to the user. + // Display a message to the user. if (isset($row->title)) { drupal_set_message(t('%user is an editor so has also been granted the group administrator role for the group: %group.', array('%user' => $account->name, '%group' => $row->title)), 'status'); } diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/README.md b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/README.md index 355e30ddc..4920b4032 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/README.md +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/README.md @@ -10,7 +10,7 @@ The DKAN Dataset API module is only a light wrapper around the <a href="https:// * <a href="https://www.drupal.org/node/1827698">Using REST Server with 2-Legged OAuth Authentication (Example with Java Servlet)</a> * <a href="http://tylerfrankenstein.com/code/drupal-services-csrf-token-firefox-poster">Services CSRF Token with FireFox Poster</a> -The Sessions module also [has a thriving community on the Drupal Stack Exchange](http://drupal.stackexchange.com/questions/tagged/services). +The Sessions module also [has a thriving community on the Drupal Stack Exchange](https://drupal.stackexchange.com/questions/tagged/services). ## Server Types DKAN Dataset REST API comes with a REST Server. Other server types are also incldued in the Services module but not turned on. Those include: @@ -57,7 +57,7 @@ For an example of a fully-functional python-based client to the DKAN REST API, s ```php // Setup request URL. -$request_url = 'http://example.com/api/dataset/user/login'; +$request_url = 'https://example.com/api/dataset/user/login'; // Prepare user data. $user_data = array( @@ -89,7 +89,7 @@ $cookie_session = $logged_user->session_name . '=' . $logged_user->sessid; ``` // Setup request URL. -$request_url = 'http://example.com/services/session/token'; +$request_url = 'https://example.com/services/session/token'; // Setup request. $curl = curl_init($request_url); @@ -108,7 +108,7 @@ $csrf_token = curl_exec($curl); ``` // Setup request URL. -$request_url = 'http://example.com/api/dataset/node'; +$request_url = 'https://example.com/api/dataset/node'; // Setup resource data. // A great explanation on how to target each node field can be found on the 'Identifying field names' article linked on the 'Documentation' section. @@ -138,7 +138,7 @@ $response = curl_exec($curl); ``` // Setup request URL. -$request_url = 'http://example.com/api/dataset/node/' . $resource_id . '/attach_file'; +$request_url = 'https://example.com/api/dataset/node/' . $resource_id . '/attach_file'; // Setup file data. $file_data = array( @@ -165,7 +165,7 @@ $response = curl_exec($curl); ``` // Setup request URL. -$request_url = 'http://example.com/api/dataset/node'; +$request_url = 'https://example.com/api/dataset/node'; // Setup dataset data. // A great explanation on how to target each node field can be found on the 'Identifying field names' article linked on the 'Documentation' section. @@ -493,7 +493,7 @@ This is a two-step process with the API: "title":"A resource created via the DKAN REST API", "type":"resource", "body": {"und": [{"value": "This should be the description for the resource."}]}, - "field_link_api": {"und": [{"url": "http://data.worldbank.org/"}]} + "field_link_api": {"und": [{"url": "https://data.worldbank.org/"}]} }' ``` diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.module b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.module index a65627c10..4d1ac31e7 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.module +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.module @@ -35,3 +35,188 @@ function dkan_dataset_rest_api_services_request_postprocess_alter($controller, $ } } } + +/** + * Implements hook_services_resources_alter(). + * + * Out of the box, the services module handles nodes, but they use the Form API + * to enforce data validation. This is a reasonable approach given that lots + * of validation is attached to the forms used to input/update data, but it + * also brings complications due the the structure differences between forms + * and the objects accepted by the Entity API. We are overriding the node + * handling to allow Entity API acceptable structures when working with + * services while still keeping some of the validation for the data. + */ +function dkan_dataset_rest_api_services_resources_alter(&$resources, $endpoint) { + if (isset($resources['node']['operations']['create'])) { + $resources['node']['operations']['create']['callback'] = + "_dkan_dataset_rest_api_resource_create"; + } + + if (isset($resources['node']['operations']['update'])) { + $resources['node']['operations']['update']['callback'] = + "_dkan_dataset_rest_api_resource_update"; + } +} + +/** + * Services operation callback: node creation. + */ +function _dkan_dataset_rest_api_resource_create($request) { + $node_array = _services_arg_value($request, 'node'); + $node = (object) $node_array; + + if (isset($node->type)) { + if ($node->type == "dataset" || $node->type == "resource") { + + try { + field_attach_validate('node', $node); + _dkan_dataset_rest_api_field_validation($node); + } + catch (\Exception $e) { + return services_error($e->getMessage()); + } + + node_save($node); + + $nid = $node->nid; + $response = array('nid' => $nid); + if ($uri = services_resource_uri(array('node', $nid))) { + $response['uri'] = $uri; + } + } + else { + $response = _node_resource_create($request); + } + } + else { + return services_error("Type not set for node"); + } + + return $response; +} + +/** + * Services operation callback: node update. + */ +function _dkan_dataset_rest_api_resource_update($nid, $request) { + $node = node_load($nid); + + if (isset($node->type)) { + if ($node->type == "dataset" || $node->type == "resource") { + + $node_array = _services_arg_value($request, 'node'); + + if (!empty($node_array['type']) && $node_array['type'] != $node->type) { + // Node types cannot be changed once they are created. + return services_error(t('Node type cannot be changed'), 406); + } + + foreach ($node_array as $field => $value) { + $node->{$field} = $value; + } + + try { + field_attach_validate('node', $node); + _dkan_dataset_rest_api_field_validation($node); + } + catch (\Exception $e) { + return services_error($e->getMessage()); + } + + if (!isset($node->revision)) { + $node->revision = 1; + } + + node_save($node); + + $nid = $node->nid; + $response = array('nid' => $nid); + if ($uri = services_resource_uri(array('node', $nid))) { + $response['uri'] = $uri; + } + return $response; + } + else { + return _node_resource_update($nid, $request); + } + } + else { + return services_error("Type not set for node"); + } +} + +/** + * Basic validation of fields. + * + * Currently we are only checking for required fields, and that the + * values in an options/select list field are valid. + */ +function _dkan_dataset_rest_api_field_validation($node) { + $instances = field_info_instances('node', $node->type); + + foreach ($instances as $field_name => $info) { + if ($info['required'] == 1 && empty($node->{$field_name})) { + throw new Exception("Field {$field_name} is required"); + } + + if (!empty($node->{$field_name})) { + $options = _dkan_dataset_rest_api_field_validation_get_options($node, $field_name, $info); + + // Check that the values match the options. + if (!empty($options) && is_array($options)) { + _dkan_dataset_rest_api_field_validation_check_field_values_against_options($field_name, $node->{$field_name}, $options); + } + } + } +} + +/** + * Get options for a field. + */ +function _dkan_dataset_rest_api_field_validation_get_options($node, $field_name, $field_instance) { + $options = []; + + // Look for predefined options for this field. + if (!empty($field_instance['widget']['settings']['available_options'])) { + $string = $field_instance['widget']['settings']['available_options']; + $lines = explode(PHP_EOL, $string); + foreach ($lines as $line) { + $pieces = explode("|", $line); + $options[trim($pieces[0])] = trim($pieces[1]); + } + } + else { + $field = field_info_field($field_name); + $properties = [ + 'strip_tags' => FALSE, + 'strip_tags_and_unescape' => FALSE, + 'filter_xss' => FALSE, + 'empty_option' => FALSE, + 'optgroups' => FALSE + ]; + + $options = _options_get_options($field, $field_instance, $properties, 'node', $node); + } + + return $options; +} + +/** + * Check field values against field options. + */ +function _dkan_dataset_rest_api_field_validation_check_field_values_against_options($field_name, $field_values, $options) { + $keys = array_keys($options); + + foreach ($field_values as $language => $info) { + foreach ($info as $delta => $info2) { + foreach ($info2 as $property => $value) { + if (substr_count($property, "value") > 0) { + if (!in_array($value, $keys)) { + throw new \Exception("Invalid option for field {$field_name}"); + } + } + } + } + } +} diff --git a/dkan/modules/dkan/dkan_datastore/README.md b/dkan/modules/dkan/dkan_datastore/README.md index a32b328b4..affbd7bc7 100644 --- a/dkan/modules/dkan/dkan_datastore/README.md +++ b/dkan/modules/dkan/dkan_datastore/README.md @@ -8,9 +8,9 @@ CSV and XML files uploaded to DKAN through the "Add Resources" form or through t ### Manual Processing -Files are parsed and inserted in batches. The user has the option of parsing them upon form submission. If the user chooses to parse the file manually they are able to see the progress of the processing through a batch operations screen similar to the one below. +Files are parsed and inserted in batches. The user has the option of parsing them upon form submission. If the user chooses to parse the file manually they are able to see the progress of the processing through a batch operations screen similar to the one below. -![Drupal batch operation](http://drupal.org/files/images/computed_field_tools_drupal7_batch.png) +![Drupal batch operation](https://drupal.org/files/images/computed_field_tools_drupal7_batch.png) ### Cron Processing @@ -66,4 +66,4 @@ drush dsfd (datastore-id) ```bash drush dsfuri (datastore-id) -```Z \ No newline at end of file +```Z diff --git a/dkan/modules/dkan/dkan_datastore/dkan_datastore.info b/dkan/modules/dkan/dkan_datastore/dkan_datastore.info index c8ef7bf63..fc7f17f21 100644 --- a/dkan/modules/dkan/dkan_datastore/dkan_datastore.info +++ b/dkan/modules/dkan/dkan_datastore/dkan_datastore.info @@ -22,4 +22,4 @@ features[views_view][] = datasets files[] = includes/Datastore.inc files[] = includes/DkanDatastore.inc files[] = includes/DkanDatastoreFastImport.inc -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/README.md b/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/README.md index c2a08da38..d52bafab7 100644 --- a/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/README.md +++ b/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/README.md @@ -1,5 +1,5 @@ # Datastore API -DKAN offers a Datastore API as a custom endpoint for the Drupal Services module. This API is designed to be as compatible as possible with the [CKAN Datastore API] (http://ckan.readthedocs.org/en/latest/maintaining/datastore.html). +DKAN offers a Datastore API as a custom endpoint for the Drupal Services module. This API is designed to be as compatible as possible with the [CKAN Datastore API](https://ckan.readthedocs.org/en/latest/maintaining/datastore.html). For more information, see the [documentation](https://dkan.readthedocs.io/en/latest/). diff --git a/dkan/modules/dkan/dkan_fixtures/dkan_fixtures.info b/dkan/modules/dkan/dkan_fixtures/dkan_fixtures.info index 1e7577a4c..87dee53dd 100644 --- a/dkan/modules/dkan/dkan_fixtures/dkan_fixtures.info +++ b/dkan/modules/dkan/dkan_fixtures/dkan_fixtures.info @@ -14,4 +14,4 @@ files[] = includes/page.inc files[] = includes/panelized_node.inc files[] = includes/resource.inc files[] = includes/visualization_entity.inc -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/data_dashboard_show%3Fid=65ac2924-92c8-4915-b228-c7975ccb61b0.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/data_dashboard_show%3Fid=65ac2924-92c8-4915-b228-c7975ccb61b0.json index 03d5e4336..dd915b826 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/data_dashboard_show%3Fid=65ac2924-92c8-4915-b228-c7975ccb61b0.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/data_dashboard_show%3Fid=65ac2924-92c8-4915-b228-c7975ccb61b0.json @@ -98,9 +98,9 @@ "language": "", "field_basic_text_text": [ { - "value": "Getting from place to place looks different for every citizen, so transportation comes in many shapes and sizes. Some regions rely on local subways and trolleys while others adopt modern modes like Bus Rapid Transit (BRT) and bikeshare. In many cases, regions use a diverse combination of all transportation types to meet the needs and preferences of an increasingly multi-modal world. \r\n\r\nThe dynamic map above visualizes the traffic on [Long Island Rail Road](http://www.baruch.cuny.edu/nycdata/travel/lirr-stats.htm), a heavy rail line in New York City, NY. \r\n\r\nThe LIRR makes **124** stops\r\nto serve **85,868,246** commuters annually, \r\n**298,448** of whom are weekday passengers.\r\n\r\nOn the map, each dot lighting up represents a train making a stop. The flashing map shows how many people use these services in the course of just 20 minutes. Looking at the map for only a couple seconds, it's easy to see the role transportation plays in our daily lives. \r\n\r\nThat's why it's important to have a thorough understanding of our systems and how citizens navigate within them. Visualizations provide a better way to understand complex networks, key challenges, and opportunities. Open data helps make it happen. In fact, this map was created by a citizen with open data. \r\n\r\nExplore the map above and other visualizations on this open data dashboard to learn more about commuter flows in different parts of the country. \r\n", + "value": "Getting from place to place looks different for every citizen, so transportation comes in many shapes and sizes. Some regions rely on local subways and trolleys while others adopt modern modes like Bus Rapid Transit (BRT) and bikeshare. In many cases, regions use a diverse combination of all transportation types to meet the needs and preferences of an increasingly multi-modal world. \r\n\r\nThe dynamic map above visualizes the traffic on [Long Island Rail Road](https://www.baruch.cuny.edu/nycdata/travel/lirr-stats.htm), a heavy rail line in New York City, NY. \r\n\r\nThe LIRR makes **124** stops\r\nto serve **85,868,246** commuters annually, \r\n**298,448** of whom are weekday passengers.\r\n\r\nOn the map, each dot lighting up represents a train making a stop. The flashing map shows how many people use these services in the course of just 20 minutes. Looking at the map for only a couple seconds, it's easy to see the role transportation plays in our daily lives. \r\n\r\nThat's why it's important to have a thorough understanding of our systems and how citizens navigate within them. Visualizations provide a better way to understand complex networks, key challenges, and opportunities. Open data helps make it happen. In fact, this map was created by a citizen with open data. \r\n\r\nExplore the map above and other visualizations on this open data dashboard to learn more about commuter flows in different parts of the country. \r\n", "format": "html", - "safe_value": "<p>Getting from place to place looks different for every citizen, so transportation comes in many shapes and sizes. Some regions rely on local subways and trolleys while others adopt modern modes like Bus Rapid Transit (BRT) and bikeshare. In many cases, regions use a diverse combination of all transportation types to meet the needs and preferences of an increasingly multi-modal world.</p>\n<p>The dynamic map above visualizes the traffic on <a href=\"http://www.baruch.cuny.edu/nycdata/travel/lirr-stats.htm\">Long Island Rail Road</a>, a heavy rail line in New York City, NY.</p>\n<p>The LIRR makes <strong>124</strong> stops<br />\nto serve <strong>85,868,246</strong> commuters annually,<br />\n<strong>298,448</strong> of whom are weekday passengers.</p>\n<p>On the map, each dot lighting up represents a train making a stop. The flashing map shows how many people use these services in the course of just 20 minutes. Looking at the map for only a couple seconds, it's easy to see the role transportation plays in our daily lives.</p>\n<p>That's why it's important to have a thorough understanding of our systems and how citizens navigate within them. Visualizations provide a better way to understand complex networks, key challenges, and opportunities. Open data helps make it happen. In fact, this map was created by a citizen with open data.</p>\n<p>Explore the map above and other visualizations on this open data dashboard to learn more about commuter flows in different parts of the country.</p>\n" + "safe_value": "<p>Getting from place to place looks different for every citizen, so transportation comes in many shapes and sizes. Some regions rely on local subways and trolleys while others adopt modern modes like Bus Rapid Transit (BRT) and bikeshare. In many cases, regions use a diverse combination of all transportation types to meet the needs and preferences of an increasingly multi-modal world.</p>\n<p>The dynamic map above visualizes the traffic on <a href=\"https://www.baruch.cuny.edu/nycdata/travel/lirr-stats.htm\">Long Island Rail Road</a>, a heavy rail line in New York City, NY.</p>\n<p>The LIRR makes <strong>124</strong> stops<br />\nto serve <strong>85,868,246</strong> commuters annually,<br />\n<strong>298,448</strong> of whom are weekday passengers.</p>\n<p>On the map, each dot lighting up represents a train making a stop. The flashing map shows how many people use these services in the course of just 20 minutes. Looking at the map for only a couple seconds, it's easy to see the role transportation plays in our daily lives.</p>\n<p>That's why it's important to have a thorough understanding of our systems and how citizens navigate within them. Visualizations provide a better way to understand complex networks, key challenges, and opportunities. Open data helps make it happen. In fact, this map was created by a citizen with open data.</p>\n<p>Explore the map above and other visualizations on this open data dashboard to learn more about commuter flows in different parts of the country.</p>\n" } ], "rdf_mapping": [] @@ -164,9 +164,9 @@ "language": "", "field_basic_text_text": [ { - "value": "The movement of transit can be difficult to capture and quantify, let alone make into an engaging visualization. General Transit Feed Specification (GTFS) data creates a common format for agencies to provide data and developers to consume it. The dynamic heat map above [uses open GTFS data](http://developer.metro.net/introduction/gtfs-data/download-metros-gtfs-data/) to highlight the life of a transit network. \r\n\r\nThis map shows where Bus Rapid Transit (BRT) lines are operating in the LA Metro area. BRT is different from a standard bus route that is common to most transportation networks. Standard routes have stops designated, and the bus may make as many stops as needed. In some cases, a stop could mean a single city block. Bus Rapid Transit lines minimize time spent commuting as well as auto congestion by covering more ground and making fewer stops. This map is made with the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site. \r\n\r\n\r\n\r\nFrom the spending perspective, BRT is also much more affordable, flexible, and sustainable than any rail options. Especially for newer cities without rail lines and sprawled metropolitan areas, BRT can translate into an important piece of the larger transportation network. In the case of LA, [BRT could triple the size of the network without great expense](http://la.streetsblog.org/2014/06/03/guest-opinion-the-future-of-los-angeles-is-bus-rapid-transit/). \r\n\r\nIn the visualization above, the higher the concentration of BRT lines, the brighter the color. With this map, it's easy to see which areas in LA's metro area are getting the most service (as measured by bus activity) and give agencies insight on how to [best allocate resources](https://losangeles2b.files.wordpress.com/2012/12/web-_ten.pdf). ", + "value": "The movement of transit can be difficult to capture and quantify, let alone make into an engaging visualization. General Transit Feed Specification (GTFS) data creates a common format for agencies to provide data and developers to consume it. The dynamic heat map above [uses open GTFS data](https://developer.metro.net/introduction/gtfs-data/download-metros-gtfs-data/) to highlight the life of a transit network. \r\n\r\nThis map shows where Bus Rapid Transit (BRT) lines are operating in the LA Metro area. BRT is different from a standard bus route that is common to most transportation networks. Standard routes have stops designated, and the bus may make as many stops as needed. In some cases, a stop could mean a single city block. Bus Rapid Transit lines minimize time spent commuting as well as auto congestion by covering more ground and making fewer stops. This map is made with the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site. \r\n\r\n\r\n\r\nFrom the spending perspective, BRT is also much more affordable, flexible, and sustainable than any rail options. Especially for newer cities without rail lines and sprawled metropolitan areas, BRT can translate into an important piece of the larger transportation network. In the case of LA, [BRT could triple the size of the network without great expense](http://la.streetsblog.org/2014/06/03/guest-opinion-the-future-of-los-angeles-is-bus-rapid-transit/). \r\n\r\nIn the visualization above, the higher the concentration of BRT lines, the brighter the color. With this map, it's easy to see which areas in LA's metro area are getting the most service (as measured by bus activity) and give agencies insight on how to [best allocate resources](https://losangeles2b.files.wordpress.com/2012/12/web-_ten.pdf). ", "format": "html", - "safe_value": "<p>The movement of transit can be difficult to capture and quantify, let alone make into an engaging visualization. General Transit Feed Specification (GTFS) data creates a common format for agencies to provide data and developers to consume it. The dynamic heat map above <a href=\"http://developer.metro.net/introduction/gtfs-data/download-metros-gtfs-data/\">uses open GTFS data</a> to highlight the life of a transit network.</p>\n<p>This map shows where Bus Rapid Transit (BRT) lines are operating in the LA Metro area. BRT is different from a standard bus route that is common to most transportation networks. Standard routes have stops designated, and the bus may make as many stops as needed. In some cases, a stop could mean a single city block. Bus Rapid Transit lines minimize time spent commuting as well as auto congestion by covering more ground and making fewer stops. This map is made with the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site.</p>\n<p>From the spending perspective, BRT is also much more affordable, flexible, and sustainable than any rail options. Especially for newer cities without rail lines and sprawled metropolitan areas, BRT can translate into an important piece of the larger transportation network. In the case of LA, <a href=\"http://la.streetsblog.org/2014/06/03/guest-opinion-the-future-of-los-angeles-is-bus-rapid-transit/\">BRT could triple the size of the network without great expense</a>.</p>\n<p>In the visualization above, the higher the concentration of BRT lines, the brighter the color. With this map, it's easy to see which areas in LA's metro area are getting the most service (as measured by bus activity) and give agencies insight on how to <a href=\"https://losangeles2b.files.wordpress.com/2012/12/web-_ten.pdf\">best allocate resources</a>.</p>\n" + "safe_value": "<p>The movement of transit can be difficult to capture and quantify, let alone make into an engaging visualization. General Transit Feed Specification (GTFS) data creates a common format for agencies to provide data and developers to consume it. The dynamic heat map above <a href=\"https://developer.metro.net/introduction/gtfs-data/download-metros-gtfs-data/\">uses open GTFS data</a> to highlight the life of a transit network.</p>\n<p>This map shows where Bus Rapid Transit (BRT) lines are operating in the LA Metro area. BRT is different from a standard bus route that is common to most transportation networks. Standard routes have stops designated, and the bus may make as many stops as needed. In some cases, a stop could mean a single city block. Bus Rapid Transit lines minimize time spent commuting as well as auto congestion by covering more ground and making fewer stops. This map is made with the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site.</p>\n<p>From the spending perspective, BRT is also much more affordable, flexible, and sustainable than any rail options. Especially for newer cities without rail lines and sprawled metropolitan areas, BRT can translate into an important piece of the larger transportation network. In the case of LA, <a href=\"http://la.streetsblog.org/2014/06/03/guest-opinion-the-future-of-los-angeles-is-bus-rapid-transit/\">BRT could triple the size of the network without great expense</a>.</p>\n<p>In the visualization above, the higher the concentration of BRT lines, the brighter the color. With this map, it's easy to see which areas in LA's metro area are getting the most service (as measured by bus activity) and give agencies insight on how to <a href=\"https://losangeles2b.files.wordpress.com/2012/12/web-_ten.pdf\">best allocate resources</a>.</p>\n" } ], "rdf_mapping": [] @@ -416,4 +416,4 @@ } } } -} \ No newline at end of file +} diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=2a8542e4-84d7-4355-a8e6-f731c0eec486.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=2a8542e4-84d7-4355-a8e6-f731c0eec486.json index baea6db8f..4f7d7e1db 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=2a8542e4-84d7-4355-a8e6-f731c0eec486.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=2a8542e4-84d7-4355-a8e6-f731c0eec486.json @@ -10,10 +10,10 @@ "body": { "und": [ { - "value": "This is the [vision statement](http://www.cityofmadison.com/parks/about/mission.cfm) that appears on the website of the Madison Parks department. Urban forests have been [connected to improved quality of life](http://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html) due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems. \r\n\r\nMadison, Wisconsin is home to thousands of trees, and it's a core service provided by the government. Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. Improving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison. ", + "value": "This is the [vision statement](https://www.cityofmadison.com/parks/about/mission.cfm) that appears on the website of the Madison Parks department. Urban forests have been [connected to improved quality of life](https://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html) due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems. \r\n\r\nMadison, Wisconsin is home to thousands of trees, and it's a core service provided by the government. Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. Improving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison. ", "summary": "Madison, Wisconsin is home to thousands of trees, and it's a core service provided by the government. Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. Improving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison. ", "format": "html", - "safe_value": "<p>This is the <a href=\"http://www.cityofmadison.com/parks/about/mission.cfm\">vision statement</a> that appears on the website of the Madison Parks department. Urban forests have been <a href=\"http://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html\">connected to improved quality of life</a> due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems.</p>\n<p>Madison, Wisconsin is home to thousands of trees, and it's a core service provided by the government. Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. Improving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison.</p>\n", + "safe_value": "<p>This is the <a href=\"https://www.cityofmadison.com/parks/about/mission.cfm\">vision statement</a> that appears on the website of the Madison Parks department. Urban forests have been <a href=\"https://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html\">connected to improved quality of life</a> due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems.</p>\n<p>Madison, Wisconsin is home to thousands of trees, and it's a core service provided by the government. Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. Improving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison.</p>\n", "safe_summary": "<p>Madison, Wisconsin is home to thousands of trees, and it's a core service provided by the government. Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. Improving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison.</p>\n" } ] @@ -294,9 +294,9 @@ "language": "", "field_basic_text_text": [ { - "value": "This is the [vision statement](http://www.cityofmadison.com/parks/about/mission.cfm) that appears on the website of the Madison Parks department. \r\n\r\nUrban forests have been [connected to improved quality of life](http://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html) due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems. \r\n\r\nMadison, Wisconsin is home to [thousands of trees](https://data.cityofmadison.com/Parks-Recreation/Madison-Wisconsin-Street-Tree-Map-and-Table-View/jyt6-zuz3), and urban forestry is a core service provided by the local government. \r\n\r\nMadison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. \r\nImproving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison. \r\n", + "value": "This is the [vision statement](https://www.cityofmadison.com/parks/about/mission.cfm) that appears on the website of the Madison Parks department. \r\n\r\nUrban forests have been [connected to improved quality of life](https://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html) due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems. \r\n\r\nMadison, Wisconsin is home to [thousands of trees](https://data.cityofmadison.com/Parks-Recreation/Madison-Wisconsin-Street-Tree-Map-and-Table-View/jyt6-zuz3), and urban forestry is a core service provided by the local government. \r\n\r\nMadison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species. \r\nImproving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison. \r\n", "format": "html", - "safe_value": "<p>This is the <a href=\"http://www.cityofmadison.com/parks/about/mission.cfm\">vision statement</a> that appears on the website of the Madison Parks department.</p>\n<p>Urban forests have been <a href=\"http://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html\">connected to improved quality of life</a> due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems.</p>\n<p>Madison, Wisconsin is home to <a href=\"https://data.cityofmadison.com/Parks-Recreation/Madison-Wisconsin-Street-Tree-Map-and-Table-View/jyt6-zuz3\">thousands of trees</a>, and urban forestry is a core service provided by the local government.</p>\n<p>Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species.<br />\nImproving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison.</p>\n" + "safe_value": "<p>This is the <a href=\"https://www.cityofmadison.com/parks/about/mission.cfm\">vision statement</a> that appears on the website of the Madison Parks department.</p>\n<p>Urban forests have been <a href=\"https://www.huffingtonpost.com/cornelius-b-murphy-jr-phd/our-urban-forests-improve_b_5413340.html\">connected to improved quality of life</a> due to the natural ability of trees to intake harmful carbon dioxide and industrial pollutants as well as provide comfort with shade and space for people to congregate in public spaces. They're also a smart investment for government to reduce pressure from rainfall runoff on their sewer systems.</p>\n<p>Madison, Wisconsin is home to <a href=\"https://data.cityofmadison.com/Parks-Recreation/Madison-Wisconsin-Street-Tree-Map-and-Table-View/jyt6-zuz3\">thousands of trees</a>, and urban forestry is a core service provided by the local government.</p>\n<p>Madison Parks provides forestry services to not only maintain natural resources in the urban environment but also increase the diversity of native tree species.<br />\nImproving the overall green space in the city improves the quality of life, enhances public/recreational spaces, and provides opportunities for greater learning about the environment and the heritage of Madison.</p>\n" } ], "rdf_mapping": [] @@ -347,4 +347,4 @@ } } } -} \ No newline at end of file +} diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=9063c1af-460d-4755-acfc-b683953506f7.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=9063c1af-460d-4755-acfc-b683953506f7.json index ed4a4f128..d9d88a6bc 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=9063c1af-460d-4755-acfc-b683953506f7.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=9063c1af-460d-4755-acfc-b683953506f7.json @@ -10,10 +10,10 @@ "body": { "und": [ { - "value": "Since the [first studies were published in 1950 linking tobacco use to lung cancer](http://www.cdc.gov/nchs/nhis/tobacco/tobacco_history.htm) there has been exponential attention on the issue of smoking. As new research determines links between tobacco-use and harmful side effects such as cancer, policy and disincentives grow in strictness. \r\n\r\nWhile some efforts have varied in their impact, states have had great success in reducing smoking rates by increasing their tax rates on tobacco. Though the correlation isn't one-to-one, there is a clear trend: states that have a higher tax on tobacco tend to have a lower percentage of adult smokers. \r\n\r\nThe Center for Disease Control (CDC), the National Cancer Institute and several advocacy organizations such as the American Cancer Society have fought for decades to educate Americans about the dangers of smoking, and why it\u2019s best to quit as soon as possible -- or, of course, to never start in the first place.\r\n\r\nThe CDC reported in late 2014 that the US smoking rate is now at its lowest point in 50 years. The 42.1 million count of Americans smoking in 2013 marks the \u201clowest prevalence of adult smoking since the CDC's Nation Health Interview Survey began keeping such records in 1965,\u201d the agency said in a statement to NBC News [[source](http://www.nbcnews.com/health/cancer/calling-it-quits-american-smoking-hits-50-year-low-n256711)].\r\n\r\nThe visualizations below include a chart that breaks down the tax rate on tobacco by state and a map of tobacco-use rates in each state. \r\n\r\nScroll over the DKAN Chart to see which states have the highest and lowest tax rates. The Chart was created using data published on DKAN and visualized with the standard DKAN Chart feature. \r\n\r\nCompare the tax rate Chart with the rate of use map. The statistics further below show an inverse correlation between tax rate and tobacco use. That is, the higher the tax rate, the lower the use of tobacco (and vice versa). The map was made with open data in the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site. \r\n\r\n<center>[See the whole Dataset](../dataset/us-tobacco-usage-statistics)</center>\r\n", + "value": "Since the [first studies were published in 1950 linking tobacco use to lung cancer](https://www.cdc.gov/nchs/nhis/tobacco/tobacco_history.htm) there has been exponential attention on the issue of smoking. As new research determines links between tobacco-use and harmful side effects such as cancer, policy and disincentives grow in strictness. \r\n\r\nWhile some efforts have varied in their impact, states have had great success in reducing smoking rates by increasing their tax rates on tobacco. Though the correlation isn't one-to-one, there is a clear trend: states that have a higher tax on tobacco tend to have a lower percentage of adult smokers. \r\n\r\nThe Center for Disease Control (CDC), the National Cancer Institute and several advocacy organizations such as the American Cancer Society have fought for decades to educate Americans about the dangers of smoking, and why it\u2019s best to quit as soon as possible -- or, of course, to never start in the first place.\r\n\r\nThe CDC reported in late 2014 that the US smoking rate is now at its lowest point in 50 years. The 42.1 million count of Americans smoking in 2013 marks the \u201clowest prevalence of adult smoking since the CDC's Nation Health Interview Survey began keeping such records in 1965,\u201d the agency said in a statement to NBC News [[source](https://www.nbcnews.com/health/cancer/calling-it-quits-american-smoking-hits-50-year-low-n256711)].\r\n\r\nThe visualizations below include a chart that breaks down the tax rate on tobacco by state and a map of tobacco-use rates in each state. \r\n\r\nScroll over the DKAN Chart to see which states have the highest and lowest tax rates. The Chart was created using data published on DKAN and visualized with the standard DKAN Chart feature. \r\n\r\nCompare the tax rate Chart with the rate of use map. The statistics further below show an inverse correlation between tax rate and tobacco use. That is, the higher the tax rate, the lower the use of tobacco (and vice versa). The map was made with open data in the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site. \r\n\r\n<center>[See the whole Dataset](../dataset/us-tobacco-usage-statistics)</center>\r\n", "summary": "The Center for Disease Control, the National Cancer Institute and a multitude of advocacy organizations such as the American Cancer Society have fought for decades to educate Americans about the dangers of smoking, and why it\u2019s best to quit as soon as possible -- or of course, to never start in the first place", "format": "html", - "safe_value": "<p>Since the <a href=\"http://www.cdc.gov/nchs/nhis/tobacco/tobacco_history.htm\">first studies were published in 1950 linking tobacco use to lung cancer</a> there has been exponential attention on the issue of smoking. As new research determines links between tobacco-use and harmful side effects such as cancer, policy and disincentives grow in strictness.</p>\n<p>While some efforts have varied in their impact, states have had great success in reducing smoking rates by increasing their tax rates on tobacco. Though the correlation isn't one-to-one, there is a clear trend: states that have a higher tax on tobacco tend to have a lower percentage of adult smokers.</p>\n<p>The Center for Disease Control (CDC), the National Cancer Institute and several advocacy organizations such as the American Cancer Society have fought for decades to educate Americans about the dangers of smoking, and why it\u2019s best to quit as soon as possible -- or, of course, to never start in the first place.</p>\n<p>The CDC reported in late 2014 that the US smoking rate is now at its lowest point in 50 years. The 42.1 million count of Americans smoking in 2013 marks the \u201clowest prevalence of adult smoking since the CDC's Nation Health Interview Survey began keeping such records in 1965,\u201d the agency said in a statement to NBC News [<a href=\"http://www.nbcnews.com/health/cancer/calling-it-quits-american-smoking-hits-50-year-low-n256711\">source</a>].</p>\n<p>The visualizations below include a chart that breaks down the tax rate on tobacco by state and a map of tobacco-use rates in each state.</p>\n<p>Scroll over the DKAN Chart to see which states have the highest and lowest tax rates. The Chart was created using data published on DKAN and visualized with the standard DKAN Chart feature.</p>\n<p>Compare the tax rate Chart with the rate of use map. The statistics further below show an inverse correlation between tax rate and tobacco use. That is, the higher the tax rate, the lower the use of tobacco (and vice versa). The map was made with open data in the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site.</p>\n</p>\n<p><center><a href=\"../dataset/us-tobacco-usage-statistics\">See the whole Dataset</a></center></p>\n", + "safe_value": "<p>Since the <a href=\"https://www.cdc.gov/nchs/nhis/tobacco/tobacco_history.htm\">first studies were published in 1950 linking tobacco use to lung cancer</a> there has been exponential attention on the issue of smoking. As new research determines links between tobacco-use and harmful side effects such as cancer, policy and disincentives grow in strictness.</p>\n<p>While some efforts have varied in their impact, states have had great success in reducing smoking rates by increasing their tax rates on tobacco. Though the correlation isn't one-to-one, there is a clear trend: states that have a higher tax on tobacco tend to have a lower percentage of adult smokers.</p>\n<p>The Center for Disease Control (CDC), the National Cancer Institute and several advocacy organizations such as the American Cancer Society have fought for decades to educate Americans about the dangers of smoking, and why it\u2019s best to quit as soon as possible -- or, of course, to never start in the first place.</p>\n<p>The CDC reported in late 2014 that the US smoking rate is now at its lowest point in 50 years. The 42.1 million count of Americans smoking in 2013 marks the \u201clowest prevalence of adult smoking since the CDC's Nation Health Interview Survey began keeping such records in 1965,\u201d the agency said in a statement to NBC News [<a href=\"https://www.nbcnews.com/health/cancer/calling-it-quits-american-smoking-hits-50-year-low-n256711\">source</a>].</p>\n<p>The visualizations below include a chart that breaks down the tax rate on tobacco by state and a map of tobacco-use rates in each state.</p>\n<p>Scroll over the DKAN Chart to see which states have the highest and lowest tax rates. The Chart was created using data published on DKAN and visualized with the standard DKAN Chart feature.</p>\n<p>Compare the tax rate Chart with the rate of use map. The statistics further below show an inverse correlation between tax rate and tobacco use. That is, the higher the tax rate, the lower the use of tobacco (and vice versa). The map was made with open data in the digital mapping tool CartoDB. You can create your own data visualizations using digital tools and embed them onto your DKAN site.</p>\n</p>\n<p><center><a href=\"../dataset/us-tobacco-usage-statistics\">See the whole Dataset</a></center></p>\n", "safe_summary": "<p>The Center for Disease Control, the National Cancer Institute and a multitude of advocacy organizations such as the American Cancer Society have fought for decades to educate Americans about the dangers of smoking, and why it\u2019s best to quit as soon as possible -- or of course, to never start in the first place</p>\n" } ] @@ -299,4 +299,4 @@ } } } -} \ No newline at end of file +} diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=e27d899b-6d72-49c9-8807-b49424c4cf70.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=e27d899b-6d72-49c9-8807-b49424c4cf70.json index 12943ff79..b0802f2bc 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=e27d899b-6d72-49c9-8807-b49424c4cf70.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/dkan_data_story_show%3Fid=e27d899b-6d72-49c9-8807-b49424c4cf70.json @@ -10,10 +10,10 @@ "body": { "und": [ { - "value": "If you\u2019re an American over the age of 25, you may remember chickenpox -- formally known as the varicella zoster virus -- as an inevitable rite of passage. As the Center for Disease Control has written: \u201cBefore the availability of varicella vaccine in the United States almost everyone had varicella.\u201d [[source](http://www.cdc.gov/vaccines/pubs/surv-manual/chpt17-varicella.html)]\r\n\r\nThis is no exaggeration: In the pre-vaccine era, according to American Academy of Pediatrics, chickenpox was a \u201cnearly universal infection\u201d with approximately 4 million cases per year. Though most cases were in children 10 and younger, all age groups could suffer complications leading to significant hospitalizations (between 11,000 and 13,000 annually) and approximately 100 to 150 deaths per year.\r\n\r\nWith the successful widespread introduction of the varicella vaccine throughout the United States in 1995, the number of reported cases has dropped significantly. Today, illness or death by varicella is rare in the United States. \r\n\r\nThough chicken pox is no longer a concern in the developed world, we can use historical data to help other parts of the world that are under-resourced and better prepare for future diseases. Opening the data and visualizing the information gives us better insight into the biological world. \r\n\r\n[See the whole Dataset](../dataset/varicella-chickenpox-incidence-and-mortality-and-after-vaccine)", + "value": "If you\u2019re an American over the age of 25, you may remember chickenpox -- formally known as the varicella zoster virus -- as an inevitable rite of passage. As the Center for Disease Control has written: \u201cBefore the availability of varicella vaccine in the United States almost everyone had varicella.\u201d [[source](https://www.cdc.gov/vaccines/pubs/surv-manual/chpt17-varicella.html)]\r\n\r\nThis is no exaggeration: In the pre-vaccine era, according to American Academy of Pediatrics, chickenpox was a \u201cnearly universal infection\u201d with approximately 4 million cases per year. Though most cases were in children 10 and younger, all age groups could suffer complications leading to significant hospitalizations (between 11,000 and 13,000 annually) and approximately 100 to 150 deaths per year.\r\n\r\nWith the successful widespread introduction of the varicella vaccine throughout the United States in 1995, the number of reported cases has dropped significantly. Today, illness or death by varicella is rare in the United States. \r\n\r\nThough chicken pox is no longer a concern in the developed world, we can use historical data to help other parts of the world that are under-resourced and better prepare for future diseases. Opening the data and visualizing the information gives us better insight into the biological world. \r\n\r\n[See the whole Dataset](../dataset/varicella-chickenpox-incidence-and-mortality-and-after-vaccine)", "summary": "If you\u2019re an American over the age of 25, you may remember chickenpox -- formally known as the varicella zoster virus -- as an inevitable rite of passage. As the Center for Disease Control has written: \u201cBefore the availability of varicella vaccine in the United States, almost everyone had varicella.\u201d", "format": "html", - "safe_value": "<p>If you\u2019re an American over the age of 25, you may remember chickenpox -- formally known as the varicella zoster virus -- as an inevitable rite of passage. As the Center for Disease Control has written: \u201cBefore the availability of varicella vaccine in the United States almost everyone had varicella.\u201d [<a href=\"http://www.cdc.gov/vaccines/pubs/surv-manual/chpt17-varicella.html\">source</a>]</p>\n<p>This is no exaggeration: In the pre-vaccine era, according to American Academy of Pediatrics, chickenpox was a \u201cnearly universal infection\u201d with approximately 4 million cases per year. Though most cases were in children 10 and younger, all age groups could suffer complications leading to significant hospitalizations (between 11,000 and 13,000 annually) and approximately 100 to 150 deaths per year.</p>\n<p>With the successful widespread introduction of the varicella vaccine throughout the United States in 1995, the number of reported cases has dropped significantly. Today, illness or death by varicella is rare in the United States.</p>\n<p>Though chicken pox is no longer a concern in the developed world, we can use historical data to help other parts of the world that are under-resourced and better prepare for future diseases. Opening the data and visualizing the information gives us better insight into the biological world.</p>\n<p><a href=\"../dataset/varicella-chickenpox-incidence-and-mortality-and-after-vaccine\">See the whole Dataset</a></p>\n", + "safe_value": "<p>If you\u2019re an American over the age of 25, you may remember chickenpox -- formally known as the varicella zoster virus -- as an inevitable rite of passage. As the Center for Disease Control has written: \u201cBefore the availability of varicella vaccine in the United States almost everyone had varicella.\u201d [<a href=\"https://www.cdc.gov/vaccines/pubs/surv-manual/chpt17-varicella.html\">source</a>]</p>\n<p>This is no exaggeration: In the pre-vaccine era, according to American Academy of Pediatrics, chickenpox was a \u201cnearly universal infection\u201d with approximately 4 million cases per year. Though most cases were in children 10 and younger, all age groups could suffer complications leading to significant hospitalizations (between 11,000 and 13,000 annually) and approximately 100 to 150 deaths per year.</p>\n<p>With the successful widespread introduction of the varicella vaccine throughout the United States in 1995, the number of reported cases has dropped significantly. Today, illness or death by varicella is rare in the United States.</p>\n<p>Though chicken pox is no longer a concern in the developed world, we can use historical data to help other parts of the world that are under-resourced and better prepare for future diseases. Opening the data and visualizing the information gives us better insight into the biological world.</p>\n<p><a href=\"../dataset/varicella-chickenpox-incidence-and-mortality-and-after-vaccine\">See the whole Dataset</a></p>\n", "safe_summary": "<p>If you\u2019re an American over the age of 25, you may remember chickenpox -- formally known as the varicella zoster virus -- as an inevitable rite of passage. As the Center for Disease Control has written: \u201cBefore the availability of varicella vaccine in the United States, almost everyone had varicella.\u201d</p>\n" } ] diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=london-deprivation-index.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=london-deprivation-index.json index eff9fc2e3..9d2d2214d 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=london-deprivation-index.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=london-deprivation-index.json @@ -9,7 +9,7 @@ "maintainer": "DKAN", "maintainer_email": "admin@example.com", "license_title": "http://opendefinition.org/licenses/odc-odbl/", - "notes": "<p>Deprivation is measured across seven different areas or domains - income, employment, health, education, living environment, crime and barriers to services using a wide range of indicators, and the methods used show how each area compares with other areas across England using a combination of all these indicators.</p>\n<p>As stated by The Guardian, \"the data is based on a close analysis of the UK government's Indices of Multiple Deprivation - which measures relative poverty across England \u2013 by Alasdair Rae at the University of Sheffield.\" (<a href=\"http://www.theguardian.com/uk/datablog/2012/apr/12/deprivation-poverty-london\">Source</a>)</p>\n<p><strong>Source:</strong> <a href=\"http://data.london.gov.uk/dataset/indices-of-deprivation-2015\">http://data.london.gov.uk/dataset/indices-of-deprivation-2015</a></p>\n<p><strong>Related Data Story: </strong><a href=\"/story/london-income-analysis\">London Income Analysis</a></p>\n", + "notes": "<p>Deprivation is measured across seven different areas or domains - income, employment, health, education, living environment, crime and barriers to services using a wide range of indicators, and the methods used show how each area compares with other areas across England using a combination of all these indicators.</p>\n<p>As stated by The Guardian, \"the data is based on a close analysis of the UK government's Indices of Multiple Deprivation - which measures relative poverty across England \u2013 by Alasdair Rae at the University of Sheffield.\" (<a href=\"https://www.theguardian.com/uk/datablog/2012/apr/12/deprivation-poverty-london\">Source</a>)</p>\n<p><strong>Source:</strong> <a href=\"https://data.london.gov.uk/dataset/indices-of-deprivation-2015\">https://data.london.gov.uk/dataset/indices-of-deprivation-2015</a></p>\n<p><strong>Related Data Story: </strong><a href=\"/story/london-income-analysis\">London Income Analysis</a></p>\n", "url": "http://default/dataset/london-deprivation-index", "state": "Active", "log_message": "Update to resource 'English Indices of Deprivation 2010'", diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-national-foreclosure-statistics-january-2012.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-national-foreclosure-statistics-january-2012.json index 054bde5e6..fdfaac869 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-national-foreclosure-statistics-january-2012.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-national-foreclosure-statistics-january-2012.json @@ -8,7 +8,7 @@ "maintainer": "DKAN", "maintainer_email": "admin@example.com", "license_title": "http://opendefinition.org/licenses/cc-zero/", - "notes": "<p>County data: <a href=\"http://www.npr.org/templates/story/story.php?storyId=111494514\">http://www.npr.org/templates/story/story.php?storyId=111494514</a></p>\n<p>State data: <a href=\"http://statehealthfacts.org/comparetable.jsp?ind=649&cat=1\">http://statehealthfacts.org/comparetable.jsp?ind=649&cat=1</a></p>\n", + "notes": "<p>County data: <a href=\"https://www.npr.org/templates/story/story.php?storyId=111494514\">https://www.npr.org/templates/story/story.php?storyId=111494514</a></p>\n<p>State data: <a href=\"http://statehealthfacts.org/comparetable.jsp?ind=649&cat=1\">http://statehealthfacts.org/comparetable.jsp?ind=649&cat=1</a></p>\n", "url": "http://default/dataset/us-national-foreclosure-statistics-january-2012", "state": "Active", "log_message": "Update to resource '1-2012-Foreclosures-by-State'", diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-tobacco-usage-statistics.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-tobacco-usage-statistics.json index 95551fa4c..e9f3bb3bd 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-tobacco-usage-statistics.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/package_show%3Fid=us-tobacco-usage-statistics.json @@ -9,7 +9,7 @@ "maintainer": "DKAN", "maintainer_email": "admin@example.com", "license_title": "http://opendefinition.org/licenses/cc-by/", - "notes": "<p>Statistics on U.S. smoking rates and tobacco taxation rates for all fifty states.</p>\n<p><strong>Source:</strong> Centers for Disease Control and Prevention, 2015<br /><a href=\"http://www.cdc.gov/tobacco/data_statistics/state_data/\">http://www.cdc.gov/tobacco/data_statistics/state_data/</a></p>\n<p><strong>Related Data Story: </strong><a href=\"/story/state-level-policies-reduce-smoking-rates-nationwide\">State-Level Policies Reduce Smoking Rates Nationwide</a></p>\n", + "notes": "<p>Statistics on U.S. smoking rates and tobacco taxation rates for all fifty states.</p>\n<p><strong>Source:</strong> Centers for Disease Control and Prevention, 2015<br /><a href=\"https://www.cdc.gov/tobacco/data_statistics/state_data/\">https://www.cdc.gov/tobacco/data_statistics/state_data/</a></p>\n<p><strong>Related Data Story: </strong><a href=\"/story/state-level-policies-reduce-smoking-rates-nationwide\">State-Level Policies Reduce Smoking Rates Nationwide</a></p>\n", "url": "http://default/dataset/us-tobacco-usage-statistics", "state": "Active", "log_message": "Update to resource 'U.S. Adult Smoking Rate'", diff --git a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/page_show%3Fid=f2e6698b-4406-47ca-9cf4-af8016ffa411.json b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/page_show%3Fid=f2e6698b-4406-47ca-9cf4-af8016ffa411.json index 66fdc72bb..15e821761 100644 --- a/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/page_show%3Fid=f2e6698b-4406-47ca-9cf4-af8016ffa411.json +++ b/dkan/modules/dkan/dkan_fixtures/modules/dkan_default_content/data/page_show%3Fid=f2e6698b-4406-47ca-9cf4-af8016ffa411.json @@ -89,7 +89,7 @@ "configuration": { "admin_title": "Link to getdkan.org", "title": "", - "body": "Learn more about DKAN: <a href='http://getdkan.org'>getdkan.org</a>", + "body": "Learn more about DKAN: <a href='https://getdkan.org'>getdkan.org</a>", "format": "html", "substitute": 1 }, diff --git a/dkan/modules/dkan/dkan_harvest/README.md b/dkan/modules/dkan/dkan_harvest/README.md index f0f17aa42..66c603d79 100644 --- a/dkan/modules/dkan/dkan_harvest/README.md +++ b/dkan/modules/dkan/dkan_harvest/README.md @@ -1,3 +1,3 @@ # DKAN Harvest -Harvest external datasets into DKAN. See [documentation](http://dkan.readthedocs.io/en/latest/components/harvest.html). +Harvest external datasets into DKAN. See [documentation](https://dkan.readthedocs.io/en/latest/components/harvest.html). diff --git a/dkan/modules/dkan/dkan_harvest/dkan_harvest.info b/dkan/modules/dkan/dkan_harvest/dkan_harvest.info index 68e3da87d..1dcd8073f 100644 --- a/dkan/modules/dkan/dkan_harvest/dkan_harvest.info +++ b/dkan/modules/dkan/dkan_harvest/dkan_harvest.info @@ -72,4 +72,4 @@ files[] = includes/HarvestItem.php files[] = includes/HarvestCache.php files[] = includes/HarvestMigrateSQLMap.php files[] = includes/HarvestMigrateSourceList.php -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_ipe/dkan_ipe.info b/dkan/modules/dkan/dkan_ipe/dkan_ipe.info index 144d27320..792c1df71 100644 --- a/dkan/modules/dkan/dkan_ipe/dkan_ipe.info +++ b/dkan/modules/dkan/dkan_ipe/dkan_ipe.info @@ -8,4 +8,4 @@ dependencies[] = panels dependencies[] = strongarm features[features_api][] = api:2 project path = profiles/dkan/modules/dkan -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_linkchecker/css/linkchecker.css b/dkan/modules/dkan/dkan_linkchecker/css/linkchecker.css new file mode 100644 index 000000000..3fdfadc77 --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/css/linkchecker.css @@ -0,0 +1,21 @@ +.view-dkan-linkchecker-reports { + font-family: arial; + font-size: 12px; + font-weight: normal; +} +.view-dkan-linkchecker-reports .views-exposed-form .views-exposed-widget { + padding-top: 0; +} +.view-dkan-linkchecker-reports th.views-field-nothing { + text-align: center; +} +.view-dkan-linkchecker-reports td.views-field-nothing a:hover { + text-decoration: none; +} +.view-dkan-linkchecker-reports td.views-field-nothing a .btn-primary { + margin: 2px; + padding: 4px 8px; +} +.view-dkan-linkchecker-reports .views-field i { + font-size: 1.5em; +} diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.features.inc b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.features.inc new file mode 100644 index 000000000..c218b9fcd --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.features.inc @@ -0,0 +1,22 @@ +<?php + +/** + * @file + * dkan_linkchecker.features.inc + */ + +/** + * Implements hook_ctools_plugin_api(). + */ +function dkan_linkchecker_ctools_plugin_api($module = NULL, $api = NULL) { + if ($module == "strongarm" && $api == "strongarm") { + return array("version" => "1"); + } +} + +/** + * Implements hook_views_api(). + */ +function dkan_linkchecker_views_api($module = NULL, $api = NULL) { + return array("api" => "3.0"); +} diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.features.user_permission.inc b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.features.user_permission.inc new file mode 100644 index 000000000..60bb397e9 --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.features.user_permission.inc @@ -0,0 +1,53 @@ +<?php + +/** + * @file + * dkan_linkchecker.features.user_permission.inc + */ + +/** + * Implements hook_user_default_permissions(). + */ +function dkan_linkchecker_user_default_permissions() { + $permissions = array(); + + if (module_exists('linkchecker')) { + // Exported permission: 'access broken links report'. + $permissions['access broken links report'] = array( + 'name' => 'access broken links report', + 'roles' => array( + 'site manager' => 'site manager', + ), + 'module' => 'linkchecker', + ); + + // Exported permission: 'access own broken links report'. + $permissions['access own broken links report'] = array( + 'name' => 'access own broken links report', + 'roles' => array( + 'site manager' => 'site manager', + ), + 'module' => 'linkchecker', + ); + + // Exported permission: 'administer linkchecker'. + $permissions['administer linkchecker'] = array( + 'name' => 'administer linkchecker', + 'roles' => array( + 'site manager' => 'site manager', + ), + 'module' => 'linkchecker', + ); + + // Exported permission: 'edit link settings'. + $permissions['edit link settings'] = array( + 'name' => 'edit link settings', + 'roles' => array( + 'site manager' => 'site manager', + ), + 'module' => 'linkchecker', + ); + } + + return $permissions; +} diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.info b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.info new file mode 100644 index 000000000..19fe4824c --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.info @@ -0,0 +1,25 @@ +name = DKAN Link Checker +description = Checks for broken links in datasets, resources, and harvest sources. +core = 7.x +package = DKAN +dependencies[] = dkan_sitewide_menu +dependencies[] = features +dependencies[] = linkchecker +dependencies[] = menu +dependencies[] = strongarm +dependencies[] = views +features[ctools][] = strongarm:strongarm:1 +features[ctools][] = views:views_default:3.0 +features[features_api][] = api:2 +features[user_permission][] = access broken links report +features[user_permission][] = access own broken links report +features[user_permission][] = administer linkchecker +features[user_permission][] = edit link settings +features[variable][] = linkchecker_check_links_types +features[variable][] = linkchecker_scan_node_dataset +features[variable][] = linkchecker_scan_node_harvest_source +features[variable][] = linkchecker_scan_node_resource +features[views_view][] = dkan_linkchecker_reports +features_exclude[dependencies][ctools] = ctools +project path = profiles/dkan/modules/dkan +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.install b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.install new file mode 100644 index 000000000..e6a2081a6 --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.install @@ -0,0 +1,17 @@ +<?php + +/** + * @file + * Additional setup tasks for DKAN Link Checker. + */ + +/** + * Implements hook_enable(). + */ +function dkan_linkchecker_enable() { + // Disable the standard linkchecker_reports view to avoid confusion. + $list = variable_get('views_defaults'); + $n = array('linkchecker_reports' => TRUE); + $disabled = array_merge($list, $n); + variable_set('views_defaults', $disabled); +} diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.module b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.module new file mode 100644 index 000000000..7efb0cdfb --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.module @@ -0,0 +1,150 @@ +<?php + +/** + * @file + * Code for the DKAN Link Checker feature. + */ + +include_once 'dkan_linkchecker.features.inc'; + +/** + * Implements hook_preprocess_page(). + */ +function dkan_linkchecker_preprocess_page(&$vars) { + // Add additional css to the report page AND the view edit page. + if (arg(2) == 'dkan-linkchecker-report' || arg(4) == 'dkan_linkchecker_reports') { + drupal_add_css(drupal_get_path('module', 'dkan_linkchecker') . '/css/linkchecker.css'); + } +} + +/** + * Implements hook_menu(). + */ +function dkan_linkchecker_menu() { + $config_parent_normal_path = 'admin/config'; + $config_plid = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :parent AND menu_name = :menu", array(':parent' => $config_parent_normal_path, ':menu' => 'menu-command-center-menu'))->fetchField(); + + $items = array(); + // Add links to command center menu for site manager access. + $items['cc/admin/config/link-checker'] = array( + 'menu_name' => 'menu-command-center-menu', + 'title' => 'Link Checker Settings', + 'page callback' => 'drupal_goto', + 'page arguments' => array('admin/config/content/linkchecker'), + 'access arguments' => array('administer linkchecker'), + 'weight' => 10, + 'type' => MENU_NORMAL_ITEM, + 'plid' => $config_plid, + ); + $items['cc/admin/config/link-checker/dkan-linkchecker-report'] = array( + 'menu_name' => 'menu-command-center-menu', + 'title' => 'Broken Links Report', + 'page callback' => 'drupal_goto', + 'page arguments' => array('admin/reports/dkan-linkchecker-report'), + 'access arguments' => array('access broken links report'), + 'weight' => 11, + 'type' => MENU_NORMAL_ITEM, + ); + return $items; +} + +/** + * Implements hook_menu_alter(). + */ +function dkan_linkchecker_menu_alter(&$items) { + // Remove normal linkchecker report link. + $items['admin/reports/linkchecker']['access callback'] = FALSE; +} + +/** + * Implements hook_views_pre_render(). + */ +function dkan_linkchecker_views_pre_render(&$view) { + if ($view->name == 'dkan_linkchecker_reports') { + // Re-write the output of the contact email. + foreach ($view->result as $key => $result) { + $email = ''; + // Dataset results. + if (isset($result->field_field_contact_email[0]['raw']['value'])) { + $email = '<a href="mailto:' . $result->field_field_contact_email[0]['raw']['value'] . '"><i class="fa fa-envelope-square"></i></a> '; + } + if (isset($result->field_field_contact_name[0]['rendered']['#markup'])) { + $result->field_field_contact_name[0]['rendered']['#markup'] = $email . $result->field_field_contact_name[0]['raw']['safe_value']; + } + // Resource results. + if (isset($result->field_field_contact_email_1[0]['raw']['value'])) { + $email = '<a href="mailto:' . $result->field_field_contact_email_1[0]['raw']['value'] . '"><i class="fa fa-envelope-square"></i></a> '; + } + if (isset($result->field_field_contact_name_1[0]['rendered']['#markup'])) { + $result->field_field_contact_name_1[0]['rendered']['#markup'] = $email . $result->field_field_contact_name_1[0]['raw']['safe_value']; + } + } + } +} + +/** + * Implements hook_views_query_alter(). + */ +function dkan_linkchecker_views_query_alter(&$view, &$query) { + if ($view->name == 'dkan_linkchecker_reports') { + switch ($view->exposed_raw_input['field_public_access_level_value']) { + case 'public': + _access_level_query($view, $query, 'public'); + break; + + case 'private': + _access_level_query($view, $query, 'private'); + break; + + case 'restricted': + _access_level_query($view, $query, 'restricted'); + break; + + default: + break; + } + } +} + +/** + * Create filter for public access level that includes resources. + */ +function _access_level_query(&$view, &$query, $level) { + // Get the public access level value from the dataset reference field. + $join = new views_join(); + $join->table = 'field_data_field_public_access_level'; + $join->field = 'entity_id'; + $join->left_table = 'node_linkchecker_node__field_data_field_dataset_ref'; + $join->left_field = 'field_dataset_ref_target_id'; + $join->type = 'LEFT'; + + // Do the actual join. + $query->table_queue['public_access_level'] = array( + 'alias' => 'public_access_level', + 'table' => 'field_data_field_public_access_level', + 'relationship' => 'node_linkchecker_node__field_data_field_dataset_ref', + 'join' => $join, + ); + + // This gathers the dataset results. + $query->where[1] = array( + 'conditions' => array( + array( + 'field' => 'public_access_level.field_public_access_level_value', + 'value' => $level, + 'operator' => '=', + ), + ), + 'type' => 'OR', + ); + + $query->table_queue['node_linkchecker_node__field_data_field_public_access_level']['join']->type = 'LEFT'; + // This gathers the resource results. + $query->add_where(1, db_or()->condition( + 'node_linkchecker_node__field_data_field_public_access_level.field_public_access_level_value', $level)); + // Add default filters back in. + $ignore = array(200, 301, 302); + $query->add_where(2, db_and()->condition('linkchecker_link.last_checked', 0, '!=')->condition('linkchecker_link.status', '0', '<>')->condition('linkchecker_link.code', $ignore, 'NOT IN')); + + return $query; +} diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.strongarm.inc b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.strongarm.inc new file mode 100644 index 000000000..6ea4eb86e --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.strongarm.inc @@ -0,0 +1,43 @@ +<?php + +/** + * @file + * dkan_linkchecker.strongarm.inc + */ + +/** + * Implements hook_strongarm(). + */ +function dkan_linkchecker_strongarm() { + $export = array(); + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'linkchecker_check_links_types'; + $strongarm->value = '0'; + $export['linkchecker_check_links_types'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'linkchecker_scan_node_dataset'; + $strongarm->value = 1; + $export['linkchecker_scan_node_dataset'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'linkchecker_scan_node_harvest_source'; + $strongarm->value = 1; + $export['linkchecker_scan_node_harvest_source'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'linkchecker_scan_node_resource'; + $strongarm->value = 1; + $export['linkchecker_scan_node_resource'] = $strongarm; + + return $export; +} diff --git a/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.views_default.inc b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.views_default.inc new file mode 100644 index 000000000..02a80a77a --- /dev/null +++ b/dkan/modules/dkan/dkan_linkchecker/dkan_linkchecker.views_default.inc @@ -0,0 +1,477 @@ +<?php + +/** + * @file + * dkan_linkchecker.views_default.inc + */ + +/** + * Implements hook_views_default_views(). + */ +function dkan_linkchecker_views_default_views() { + $export = array(); + $view = new view(); + $view->name = 'dkan_linkchecker_reports'; + $view->description = 'Display a list of broken links.'; + $view->tag = 'default'; + $view->base_table = 'linkchecker_link'; + $view->human_name = 'DKAN Advanced Broken links'; + $view->core = 0; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Defaults */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->display->display_options['title'] = 'Private Broken links'; + $handler->display->display_options['items_per_page'] = 0; + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'perm'; + $handler->display->display_options['access']['perm'] = 'access broken links report'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['query']['options']['query_comment'] = FALSE; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['exposed_form']['options']['reset_button'] = TRUE; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = '50'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['pager']['options']['quantity'] = '9'; + $handler->display->display_options['style_plugin'] = 'table'; + $handler->display->display_options['style_options']['columns'] = array( + 'url' => 'url', + 'code' => 'code', + 'error' => 'error', + 'link_edit' => 'link_edit', + 'nid' => 'nid', + 'edit_node' => 'edit_node', + 'bid' => 'bid', + 'block_edit' => 'block_edit', + 'type' => 'type', + 'title' => 'title', + 'field_contact_email_1' => 'field_contact_email_1', + 'field_contact_email' => 'field_contact_email', + 'field_contact_name_1' => 'field_contact_name_1', + 'field_contact_name' => 'field_contact_name', + 'field_public_access_level_2' => 'field_public_access_level_2', + 'field_public_access_level' => 'field_public_access_level', + 'last_checked' => 'last_checked', + 'nothing' => 'nothing', + ); + $handler->display->display_options['style_options']['default'] = '-1'; + $handler->display->display_options['style_options']['info'] = array( + 'url' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'code' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'error' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'link_edit' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'nid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'edit_node' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'bid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'block_edit' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'type' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'title' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'field_contact_email_1' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'field_contact_email' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'field_contact_name_1' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'field_contact_name' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'field_public_access_level_2' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'field_public_access_level' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'last_checked' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'nothing' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + $handler->display->display_options['style_options']['sticky'] = TRUE; + $handler->display->display_options['style_options']['empty_table'] = TRUE; + /* Header: Global: Result summary */ + $handler->display->display_options['header']['result']['id'] = 'result'; + $handler->display->display_options['header']['result']['table'] = 'views'; + $handler->display->display_options['header']['result']['field'] = 'result'; + /* No results behavior: Global: Text area */ + $handler->display->display_options['empty']['area']['id'] = 'area'; + $handler->display->display_options['empty']['area']['table'] = 'views'; + $handler->display->display_options['empty']['area']['field'] = 'area'; + $handler->display->display_options['empty']['area']['empty'] = TRUE; + $handler->display->display_options['empty']['area']['content'] = 'No broken links have been found.'; + $handler->display->display_options['empty']['area']['format'] = 'plain_text'; + /* Relationship: Broken links: Content with link */ + $handler->display->display_options['relationships']['nid']['id'] = 'nid'; + $handler->display->display_options['relationships']['nid']['table'] = 'linkchecker_node'; + $handler->display->display_options['relationships']['nid']['field'] = 'nid'; + /* Relationship: Entity Reference: Referenced Entity */ + $handler->display->display_options['relationships']['field_dataset_ref_target_id']['id'] = 'field_dataset_ref_target_id'; + $handler->display->display_options['relationships']['field_dataset_ref_target_id']['table'] = 'field_data_field_dataset_ref'; + $handler->display->display_options['relationships']['field_dataset_ref_target_id']['field'] = 'field_dataset_ref_target_id'; + $handler->display->display_options['relationships']['field_dataset_ref_target_id']['relationship'] = 'nid'; + /* Field: Broken links: URL */ + $handler->display->display_options['fields']['url']['id'] = 'url'; + $handler->display->display_options['fields']['url']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['url']['field'] = 'url'; + $handler->display->display_options['fields']['url']['alter']['max_length'] = '40'; + $handler->display->display_options['fields']['url']['alter']['word_boundary'] = FALSE; + $handler->display->display_options['fields']['url']['alter']['trim'] = TRUE; + $handler->display->display_options['fields']['url']['hide_empty'] = TRUE; + /* Field: Broken links: HTTP status code */ + $handler->display->display_options['fields']['code']['id'] = 'code'; + $handler->display->display_options['fields']['code']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['code']['field'] = 'code'; + $handler->display->display_options['fields']['code']['label'] = 'Response'; + $handler->display->display_options['fields']['code']['separator'] = ''; + /* Field: Broken links: Error message */ + $handler->display->display_options['fields']['error']['id'] = 'error'; + $handler->display->display_options['fields']['error']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['error']['field'] = 'error'; + $handler->display->display_options['fields']['error']['label'] = 'Error'; + /* Field: Broken links: Edit link settings */ + $handler->display->display_options['fields']['link_edit']['id'] = 'link_edit'; + $handler->display->display_options['fields']['link_edit']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['link_edit']['field'] = 'link_edit'; + $handler->display->display_options['fields']['link_edit']['exclude'] = TRUE; + $handler->display->display_options['fields']['link_edit']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['link_edit']['alter']['text'] = '<div class="btn-primary">Edit link settings</div>'; + $handler->display->display_options['fields']['link_edit']['hide_empty'] = TRUE; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['relationship'] = 'nid'; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; + /* Field: Content: Edit link */ + $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node'; + $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['relationship'] = 'nid'; + $handler->display->display_options['fields']['edit_node']['label'] = 'Edit node'; + $handler->display->display_options['fields']['edit_node']['exclude'] = TRUE; + $handler->display->display_options['fields']['edit_node']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['edit_node']['alter']['text'] = '<div class="btn-primary">Edit node [nid]</div>'; + $handler->display->display_options['fields']['edit_node']['hide_empty'] = TRUE; + /* Field: Content: Type */ + $handler->display->display_options['fields']['type']['id'] = 'type'; + $handler->display->display_options['fields']['type']['table'] = 'node'; + $handler->display->display_options['fields']['type']['field'] = 'type'; + $handler->display->display_options['fields']['type']['relationship'] = 'nid'; + /* Field: Content: Title */ + $handler->display->display_options['fields']['title']['id'] = 'title'; + $handler->display->display_options['fields']['title']['table'] = 'node'; + $handler->display->display_options['fields']['title']['field'] = 'title'; + $handler->display->display_options['fields']['title']['relationship'] = 'nid'; + /* Field: Resource contact email */ + $handler->display->display_options['fields']['field_contact_email_1']['id'] = 'field_contact_email_1'; + $handler->display->display_options['fields']['field_contact_email_1']['table'] = 'field_data_field_contact_email'; + $handler->display->display_options['fields']['field_contact_email_1']['field'] = 'field_contact_email'; + $handler->display->display_options['fields']['field_contact_email_1']['relationship'] = 'field_dataset_ref_target_id'; + $handler->display->display_options['fields']['field_contact_email_1']['ui_name'] = 'Resource contact email'; + $handler->display->display_options['fields']['field_contact_email_1']['label'] = ''; + $handler->display->display_options['fields']['field_contact_email_1']['exclude'] = TRUE; + $handler->display->display_options['fields']['field_contact_email_1']['element_label_colon'] = FALSE; + /* Field: Dataset contact email */ + $handler->display->display_options['fields']['field_contact_email']['id'] = 'field_contact_email'; + $handler->display->display_options['fields']['field_contact_email']['table'] = 'field_data_field_contact_email'; + $handler->display->display_options['fields']['field_contact_email']['field'] = 'field_contact_email'; + $handler->display->display_options['fields']['field_contact_email']['relationship'] = 'nid'; + $handler->display->display_options['fields']['field_contact_email']['ui_name'] = 'Dataset contact email'; + $handler->display->display_options['fields']['field_contact_email']['label'] = ''; + $handler->display->display_options['fields']['field_contact_email']['exclude'] = TRUE; + $handler->display->display_options['fields']['field_contact_email']['element_label_colon'] = FALSE; + /* Field: Content: Contact Name */ + $handler->display->display_options['fields']['field_contact_name_1']['id'] = 'field_contact_name_1'; + $handler->display->display_options['fields']['field_contact_name_1']['table'] = 'field_data_field_contact_name'; + $handler->display->display_options['fields']['field_contact_name_1']['field'] = 'field_contact_name'; + $handler->display->display_options['fields']['field_contact_name_1']['relationship'] = 'field_dataset_ref_target_id'; + $handler->display->display_options['fields']['field_contact_name_1']['label'] = ''; + $handler->display->display_options['fields']['field_contact_name_1']['exclude'] = TRUE; + $handler->display->display_options['fields']['field_contact_name_1']['element_label_colon'] = FALSE; + /* Field: Content: Contact Name */ + $handler->display->display_options['fields']['field_contact_name']['id'] = 'field_contact_name'; + $handler->display->display_options['fields']['field_contact_name']['table'] = 'field_data_field_contact_name'; + $handler->display->display_options['fields']['field_contact_name']['field'] = 'field_contact_name'; + $handler->display->display_options['fields']['field_contact_name']['relationship'] = 'nid'; + $handler->display->display_options['fields']['field_contact_name']['empty'] = '[field_contact_name_1]'; + /* Field: Resource Access Level */ + $handler->display->display_options['fields']['field_public_access_level_2']['id'] = 'field_public_access_level_2'; + $handler->display->display_options['fields']['field_public_access_level_2']['table'] = 'field_data_field_public_access_level'; + $handler->display->display_options['fields']['field_public_access_level_2']['field'] = 'field_public_access_level'; + $handler->display->display_options['fields']['field_public_access_level_2']['relationship'] = 'field_dataset_ref_target_id'; + $handler->display->display_options['fields']['field_public_access_level_2']['ui_name'] = 'Resource Access Level'; + $handler->display->display_options['fields']['field_public_access_level_2']['label'] = 'Resource Access Level'; + $handler->display->display_options['fields']['field_public_access_level_2']['exclude'] = TRUE; + /* Field: Dataset Access Level */ + $handler->display->display_options['fields']['field_public_access_level']['id'] = 'field_public_access_level'; + $handler->display->display_options['fields']['field_public_access_level']['table'] = 'field_data_field_public_access_level'; + $handler->display->display_options['fields']['field_public_access_level']['field'] = 'field_public_access_level'; + $handler->display->display_options['fields']['field_public_access_level']['relationship'] = 'nid'; + $handler->display->display_options['fields']['field_public_access_level']['ui_name'] = 'Dataset Access Level'; + $handler->display->display_options['fields']['field_public_access_level']['label'] = 'Access Level'; + $handler->display->display_options['fields']['field_public_access_level']['empty'] = '[field_public_access_level_2]'; + /* Field: Broken links: Last checked */ + $handler->display->display_options['fields']['last_checked']['id'] = 'last_checked'; + $handler->display->display_options['fields']['last_checked']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['last_checked']['field'] = 'last_checked'; + $handler->display->display_options['fields']['last_checked']['date_format'] = 'iso_8601_date'; + $handler->display->display_options['fields']['last_checked']['second_date_format'] = 'iso_8601_date'; + /* Field: Global: Custom text */ + $handler->display->display_options['fields']['nothing']['id'] = 'nothing'; + $handler->display->display_options['fields']['nothing']['table'] = 'views'; + $handler->display->display_options['fields']['nothing']['field'] = 'nothing'; + $handler->display->display_options['fields']['nothing']['label'] = 'Operations'; + $handler->display->display_options['fields']['nothing']['alter']['text'] = '[link_edit] + [edit_node]'; + $handler->display->display_options['fields']['nothing']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = TRUE; + /* Sort criterion: Content: Title */ + $handler->display->display_options['sorts']['title']['id'] = 'title'; + $handler->display->display_options['sorts']['title']['table'] = 'node'; + $handler->display->display_options['sorts']['title']['field'] = 'title'; + $handler->display->display_options['sorts']['title']['relationship'] = 'nid'; + /* Filter criterion: Broken links: Last checked */ + $handler->display->display_options['filters']['last_checked']['id'] = 'last_checked'; + $handler->display->display_options['filters']['last_checked']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['last_checked']['field'] = 'last_checked'; + $handler->display->display_options['filters']['last_checked']['operator'] = '!='; + $handler->display->display_options['filters']['last_checked']['value']['value'] = '0'; + $handler->display->display_options['filters']['last_checked']['group'] = 1; + /* Filter criterion: Broken links: Status */ + $handler->display->display_options['filters']['status']['id'] = 'status'; + $handler->display->display_options['filters']['status']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['status']['field'] = 'status'; + $handler->display->display_options['filters']['status']['value'] = '1'; + $handler->display->display_options['filters']['status']['group'] = 1; + $handler->display->display_options['filters']['status']['expose']['operator_id'] = ''; + $handler->display->display_options['filters']['status']['expose']['label'] = 'Check link status'; + $handler->display->display_options['filters']['status']['expose']['operator'] = 'status_op'; + $handler->display->display_options['filters']['status']['expose']['identifier'] = 'status'; + $handler->display->display_options['filters']['status']['expose']['required'] = TRUE; + /* Filter criterion: Broken links: HTTP status code */ + $handler->display->display_options['filters']['code_1']['id'] = 'code_1'; + $handler->display->display_options['filters']['code_1']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['code_1']['field'] = 'code'; + $handler->display->display_options['filters']['code_1']['operator'] = 'not in'; + $handler->display->display_options['filters']['code_1']['value'] = array( + 200 => '200', + 301 => '301', + 302 => '302', + ); + $handler->display->display_options['filters']['code_1']['group'] = 1; + /* Filter criterion: Broken links: HTTP status code */ + $handler->display->display_options['filters']['code']['id'] = 'code'; + $handler->display->display_options['filters']['code']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['code']['field'] = 'code'; + $handler->display->display_options['filters']['code']['value'] = array( + 100 => '100', + 101 => '101', + 201 => '201', + 202 => '202', + 203 => '203', + 204 => '204', + 205 => '205', + 206 => '206', + 300 => '300', + 301 => '301', + 302 => '302', + 303 => '303', + 304 => '304', + 305 => '305', + 307 => '307', + 400 => '400', + 401 => '401', + 402 => '402', + 403 => '403', + 404 => '404', + 405 => '405', + 406 => '406', + 407 => '407', + 408 => '408', + 409 => '409', + 410 => '410', + 411 => '411', + 412 => '412', + 413 => '413', + 414 => '414', + 415 => '415', + 416 => '416', + 417 => '417', + 500 => '500', + 501 => '501', + 502 => '502', + 503 => '503', + 504 => '504', + 505 => '505', + -10053 => '-10053', + -11001 => '-11001', + ); + $handler->display->display_options['filters']['code']['group'] = 1; + $handler->display->display_options['filters']['code']['exposed'] = TRUE; + $handler->display->display_options['filters']['code']['expose']['operator_id'] = 'code_op'; + $handler->display->display_options['filters']['code']['expose']['label'] = 'HTTP status code'; + $handler->display->display_options['filters']['code']['expose']['operator'] = 'code_op'; + $handler->display->display_options['filters']['code']['expose']['identifier'] = 'code'; + $handler->display->display_options['filters']['code']['expose']['remember_roles'] = array( + 2 => '2', + 11 => 0, + 1 => 0, + 21 => 0, + 16 => 0, + 26 => 0, + ); + $handler->display->display_options['filters']['code']['expose']['reduce'] = TRUE; + /* Filter criterion: Content: Type */ + $handler->display->display_options['filters']['type']['id'] = 'type'; + $handler->display->display_options['filters']['type']['table'] = 'node'; + $handler->display->display_options['filters']['type']['field'] = 'type'; + $handler->display->display_options['filters']['type']['relationship'] = 'nid'; + $handler->display->display_options['filters']['type']['value'] = array( + 'dataset' => 'dataset', + 'harvest_source' => 'harvest_source', + 'resource' => 'resource', + ); + $handler->display->display_options['filters']['type']['group'] = 1; + $handler->display->display_options['filters']['type']['exposed'] = TRUE; + $handler->display->display_options['filters']['type']['expose']['operator_id'] = 'type_op'; + $handler->display->display_options['filters']['type']['expose']['label'] = 'Type'; + $handler->display->display_options['filters']['type']['expose']['operator'] = 'type_op'; + $handler->display->display_options['filters']['type']['expose']['identifier'] = 'type'; + $handler->display->display_options['filters']['type']['expose']['remember_roles'] = array( + 2 => '2', + 11 => 0, + 1 => 0, + 21 => 0, + 16 => 0, + 26 => 0, + ); + $handler->display->display_options['filters']['type']['expose']['reduce'] = TRUE; + /* Filter criterion: Content: Public Access Level (field_public_access_level) */ + $handler->display->display_options['filters']['field_public_access_level_value']['id'] = 'field_public_access_level_value'; + $handler->display->display_options['filters']['field_public_access_level_value']['table'] = 'field_data_field_public_access_level'; + $handler->display->display_options['filters']['field_public_access_level_value']['field'] = 'field_public_access_level_value'; + $handler->display->display_options['filters']['field_public_access_level_value']['relationship'] = 'nid'; + $handler->display->display_options['filters']['field_public_access_level_value']['group'] = 1; + $handler->display->display_options['filters']['field_public_access_level_value']['exposed'] = TRUE; + $handler->display->display_options['filters']['field_public_access_level_value']['expose']['operator_id'] = 'field_public_access_level_value_op'; + $handler->display->display_options['filters']['field_public_access_level_value']['expose']['label'] = 'Public Access Level'; + $handler->display->display_options['filters']['field_public_access_level_value']['expose']['operator'] = 'field_public_access_level_value_op'; + $handler->display->display_options['filters']['field_public_access_level_value']['expose']['identifier'] = 'field_public_access_level_value'; + $handler->display->display_options['filters']['field_public_access_level_value']['expose']['remember_roles'] = array( + 2 => '2', + 3 => 0, + 1 => 0, + 5 => 0, + 4 => 0, + 6 => 0, + ); + + /* Display: Advanced Broken links */ + $handler = $view->new_display('page', 'Advanced Broken links', 'dkan_linkchecker_admin_report_page'); + $handler->display->display_options['defaults']['title'] = FALSE; + $handler->display->display_options['title'] = 'Broken Links Report'; + $handler->display->display_options['display_description'] = 'Shows a list of broken links in content, with advanced filters.'; + $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; + $handler->display->display_options['path'] = 'admin/reports/dkan-linkchecker-report'; + $handler->display->display_options['menu']['type'] = 'normal'; + $handler->display->display_options['menu']['title'] = 'Broken Links Report'; + $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in content, with advanced filters.'; + $handler->display->display_options['menu']['weight'] = '2'; + $handler->display->display_options['menu']['name'] = 'management'; + $handler->display->display_options['menu']['context'] = 0; + $handler->display->display_options['menu']['context_only_inline'] = 0; + $export['dkan_linkchecker_reports'] = $view; + return $export; +} diff --git a/dkan/modules/dkan/dkan_migrate_base/dkan_migrate_base.info b/dkan/modules/dkan/dkan_migrate_base/dkan_migrate_base.info index 701c1220f..50f3009f7 100644 --- a/dkan/modules/dkan/dkan_migrate_base/dkan_migrate_base.info +++ b/dkan/modules/dkan/dkan_migrate_base/dkan_migrate_base.info @@ -11,4 +11,4 @@ files[] = dkan_migrate_base_group.inc files[] = dkan_migrate_base_dataset.inc files[] = dkan_migrate_base_resource.inc files[] = dkan_migrate_base_data_json.inc -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_permissions/dkan_permissions.info b/dkan/modules/dkan/dkan_permissions/dkan_permissions.info index af618b62d..ee2539be1 100644 --- a/dkan/modules/dkan/dkan_permissions/dkan_permissions.info +++ b/dkan/modules/dkan/dkan_permissions/dkan_permissions.info @@ -11,4 +11,4 @@ features[roles_permissions][] = editor features[roles_permissions][] = site manager features_exclude[dependencies][features] = features project path = profiles/dkan/modules/dkan -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_plugins/dkan_plugins.info b/dkan/modules/dkan/dkan_plugins/dkan_plugins.info index bec8e33a8..595ffe7e1 100644 --- a/dkan/modules/dkan/dkan_plugins/dkan_plugins.info +++ b/dkan/modules/dkan/dkan_plugins/dkan_plugins.info @@ -6,4 +6,4 @@ dependencies[] = ctools dependencies[] = panels project path = profiles/dkan/modules/dkan scripts[] = js/colorPicker.behavior.js -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.blocks.inc b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.blocks.inc index 4748a7fb7..9ef74634a 100644 --- a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.blocks.inc +++ b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.blocks.inc @@ -169,7 +169,7 @@ function dkan_sitewide_data_extent_block() { $output = "var dataExtent = " . $geojson; $output .= "; var map = L.map('map'); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { - attribution: 'Map data © <a href=\"http://openstreetmap.org\">OpenStreetMap</a>' + attribution: 'Map data © <a href=\"https://openstreetmap.org\">OpenStreetMap</a>' }).addTo(map); var geojson = L.geoJson(dataExtent).addTo(map); @@ -295,10 +295,9 @@ function dkan_sitewide_license_block() { */ function dkan_sitewide_footer_author() { return t( - "Powered by !dkan, a project of !nucivic", + "Powered by !dkan", array( - '!dkan' => l(t('DKAN'), 'http://nucivic.com/dkan'), - '!nucivic' => l(t('NuCivic'), 'http://nucivic.com'), + '!dkan' => l(t('DKAN'), 'https://getdkan.org/'), ) ); } @@ -344,7 +343,7 @@ function dkan_sitewide_social_block() { ), 'reddit' => array( 'data' => l('<i class="ckan-icon ckan-icon-fb fa fa-lg fa-reddit-square"></i> ' . t('Reddit'), - 'http://www.reddit.com/submit', array( + 'https://www.reddit.com/submit', array( 'query' => array( 'url' => $link, 'title' => $title, @@ -437,7 +436,7 @@ function dkan_sitewide_other_access() { ), 'dkan_api' => array( '#type' => 'markup', - '#markup' => '<p><small>' . t('via the <a href="http://docs.getdkan.com/en/latest/apis/index.html">DKAN API</a>') . '</small></p>', + '#markup' => '<p><small>' . t('via the <a href="https://docs.getdkan.com/en/latest/apis/index.html">DKAN API</a>') . '</small></p>', ), ); diff --git a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info index 35eca6ea8..fa0b62d69 100644 --- a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info +++ b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info @@ -56,4 +56,4 @@ features[variable][] = user_pictures features[views_view][] = dkan_administration_files features[views_view][] = dkan_administration_nodes features[views_view][] = popular_tags -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.module b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.module index b8bffbbc4..4e797a6ba 100644 --- a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.module +++ b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.module @@ -167,7 +167,8 @@ function dkan_sitewide_update_status_alter(&$projects) { 'beautytips', 'feeds_field_fetcher', 'multistep', - 'file_resup' + 'file_resup', + 'linkchecker', ); foreach ($up_to_date_projects as $up_to_date_project) { @@ -233,10 +234,10 @@ function dkan_sitewide_update_status_alter(&$projects) { $projects[$project]['releases'][$dkan_tag]['date'] = $tag_date; $projects[$project]['datestamp'] = $tag_date; - $projects[$project]['link'] = 'http://github.com/GetDKAN/' . $project; + $projects[$project]['link'] = 'https://github.com/GetDKAN/' . $project; $projects[$project]['reason'] = 'Development Release'; $projects[$project]['releases']['latest_version'] = $dkan_tag; - $projects[$project]['releases']['7.x-1.x-dev']['release_link'] = 'http://github.com/GetDKAN/' . $project; + $projects[$project]['releases']['7.x-1.x-dev']['release_link'] = 'https://github.com/GetDKAN/' . $project; $projects[$project]['releases']['7.x-1.x-dev']['reason'] = 'Development Release'; $projects[$project]['releases']['7.x-1.x-dev']['download_link'] = 'https://api.github.com/repos/NuCivic/' . $project . '/zipball/7.x-1.x'; diff --git a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.strongarm.inc b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.strongarm.inc index 60f09ad07..aac2d7bb2 100644 --- a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.strongarm.inc +++ b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.strongarm.inc @@ -95,7 +95,7 @@ function dkan_sitewide_strongarm() { $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ $strongarm->api_version = 1; $strongarm->name = 'gravatar_url'; - $strongarm->value = 'http://www.gravatar.com/avatar/'; + $strongarm->value = 'https://www.gravatar.com/avatar/'; $export['gravatar_url'] = $strongarm; $strongarm = new stdClass(); diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.features.menu_links.inc b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.features.menu_links.inc index bd192f8b5..7e9f49452 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.features.menu_links.inc +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.features.menu_links.inc @@ -29,11 +29,31 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 0, - 'weight' => 2, + 'weight' => -50, 'customized' => 1, ); - // Exported menu link: - // menu-command-center-menu_chart:admin/structure/entity-type/visualization/ve_chart/add. + // Exported menu link: menu-command-center-menu_appearance:admin/appearance/settings. + $menu_links['menu-command-center-menu_appearance:admin/appearance/settings'] = array( + 'menu_name' => 'menu-command-center-menu', + 'link_path' => 'admin/appearance/settings', + 'router_path' => 'admin/appearance/settings', + 'link_title' => 'Appearance', + 'options' => array( + 'attributes' => array( + 'title' => '', + ), + 'identifier' => 'menu-command-center-menu_appearance:admin/appearance/settings', + ), + 'module' => 'menu', + 'hidden' => 0, + 'external' => 0, + 'has_children' => 1, + 'expanded' => 0, + 'weight' => -46, + 'customized' => 1, + 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', + ); + // Exported menu link: menu-command-center-menu_chart:admin/structure/entity-type/visualization/ve_chart/add. $menu_links['menu-command-center-menu_chart:admin/structure/entity-type/visualization/ve_chart/add'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/structure/entity-type/visualization/ve_chart/add', @@ -50,12 +70,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -50, + 'weight' => -38, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_visualization:admin/structure/entity-type/visualization/ve_chart/add', ); - // Exported menu link: - // menu-command-center-menu_charts:admin/structure/entity-type/visualization/ve_chart. + // Exported menu link: menu-command-center-menu_charts:admin/structure/entity-type/visualization/ve_chart. $menu_links['menu-command-center-menu_charts:admin/structure/entity-type/visualization/ve_chart'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/structure/entity-type/visualization/ve_chart', @@ -76,8 +95,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_visualizations:admin/structure/entity-type/visualization', ); - // Exported menu link: - // menu-command-center-menu_colorizer:admin/appearance/colorizer. + // Exported menu link: menu-command-center-menu_colorizer:admin/appearance/colorizer. $menu_links['menu-command-center-menu_colorizer:admin/appearance/colorizer'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/appearance/colorizer', @@ -94,12 +112,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -50, + 'weight' => -49, 'customized' => 1, - 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', + 'parent_identifier' => 'menu-command-center-menu_appearance:admin/appearance/settings', ); - // Exported menu link: - // menu-command-center-menu_content:admin/content. + // Exported menu link: menu-command-center-menu_content:admin/content. $menu_links['menu-command-center-menu_content:admin/content'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/content', @@ -116,11 +133,10 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => 3, + 'weight' => -49, 'customized' => 1, ); - // Exported menu link: - // menu-command-center-menu_create-user:admin/people/create. + // Exported menu link: menu-command-center-menu_create-user:admin/people/create. $menu_links['menu-command-center-menu_create-user:admin/people/create'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/people/create', @@ -137,12 +153,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => 0, + 'weight' => -50, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_people:admin/people', ); - // Exported menu link: - // menu-command-center-menu_data-dashboard:node/add/data-dashboard. + // Exported menu link: menu-command-center-menu_data-dashboard:node/add/data-dashboard. $menu_links['menu-command-center-menu_data-dashboard:node/add/data-dashboard'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/data-dashboard', @@ -163,8 +178,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_data-dashboards:admin/dkan/data-dashboards. + // Exported menu link: menu-command-center-menu_data-dashboards:admin/dkan/data-dashboards. $menu_links['menu-command-center-menu_data-dashboards:admin/dkan/data-dashboards'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/data-dashboards', @@ -185,8 +199,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_data-previews:admin/dkan/dataset_preview. + // Exported menu link: menu-command-center-menu_data-previews:admin/dkan/dataset_preview. $menu_links['menu-command-center-menu_data-previews:admin/dkan/dataset_preview'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/dataset_preview', @@ -207,8 +220,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_data-story:node/add/dkan-data-story. + // Exported menu link: menu-command-center-menu_data-story:node/add/dkan-data-story. $menu_links['menu-command-center-menu_data-story:node/add/dkan-data-story'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/dkan-data-story', @@ -229,8 +241,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_dataset:node/add/dataset. + // Exported menu link: menu-command-center-menu_dataset:node/add/dataset. $menu_links['menu-command-center-menu_dataset:node/add/dataset'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/dataset', @@ -251,8 +262,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_datasets:admin/dkan/harvest/dashboard/datasets. + // Exported menu link: menu-command-center-menu_datasets:admin/dkan/harvest/dashboard/datasets. $menu_links['menu-command-center-menu_datasets:admin/dkan/harvest/dashboard/datasets'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/harvest/dashboard/datasets', @@ -273,8 +283,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan-harvest-dashboard:admin/dkan/harvest/dashboard', ); - // Exported menu link: - // menu-command-center-menu_dcat-validation:admin/config/services/odsm/validate/dcat. + // Exported menu link: menu-command-center-menu_dcat-validation:admin/config/services/odsm/validate/dcat. $menu_links['menu-command-center-menu_dcat-validation:admin/config/services/odsm/validate/dcat'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/config/services/odsm/validate/dcat', @@ -291,12 +300,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => 0, + 'weight' => -49, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_open-data-schema-mapper:admin/config/services/odsm', ); - // Exported menu link: - // menu-command-center-menu_dkan-dataset-api:admin/dkan/dataset_api. + // Exported menu link: menu-command-center-menu_dkan-dataset-api:admin/dkan/dataset_api. $menu_links['menu-command-center-menu_dkan-dataset-api:admin/dkan/dataset_api'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/dataset_api', @@ -313,12 +321,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -48, + 'weight' => -47, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_dkan-dataset-forms:admin/dkan/dataset_forms. + // Exported menu link: menu-command-center-menu_dkan-dataset-forms:admin/dkan/dataset_forms. $menu_links['menu-command-center-menu_dkan-dataset-forms:admin/dkan/dataset_forms'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/dataset_forms', @@ -335,12 +342,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -47, + 'weight' => -46, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_dkan-harvest-dashboard:admin/dkan/harvest/dashboard. + // Exported menu link: menu-command-center-menu_dkan-harvest-dashboard:admin/dkan/harvest/dashboard. $menu_links['menu-command-center-menu_dkan-harvest-dashboard:admin/dkan/harvest/dashboard'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/harvest/dashboard', @@ -357,12 +363,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 1, - 'weight' => -46, + 'weight' => -45, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_dkan:admin/dkan. + // Exported menu link: menu-command-center-menu_dkan:admin/dkan. $menu_links['menu-command-center-menu_dkan:admin/dkan'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan', @@ -379,11 +384,10 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 0, - 'weight' => 6, + 'weight' => -46, 'customized' => 1, ); - // Exported menu link: - // menu-command-center-menu_featured-groups-sort-order:admin/dkan/featured-groups-sort-order. + // Exported menu link: menu-command-center-menu_featured-groups-sort-order:admin/dkan/featured-groups-sort-order. $menu_links['menu-command-center-menu_featured-groups-sort-order:admin/dkan/featured-groups-sort-order'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/featured-groups-sort-order', @@ -400,12 +404,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -45, + 'weight' => -44, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_fonts:admin/appearance/fontyourface. + // Exported menu link: menu-command-center-menu_fonts:admin/appearance/fontyourface. $menu_links['menu-command-center-menu_fonts:admin/appearance/fontyourface'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/appearance/fontyourface', @@ -422,12 +425,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -49, + 'weight' => -48, 'customized' => 1, - 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', + 'parent_identifier' => 'menu-command-center-menu_appearance:admin/appearance/settings', ); - // Exported menu link: - // menu-command-center-menu_group:node/add/group. + // Exported menu link: menu-command-center-menu_group:node/add/group. $menu_links['menu-command-center-menu_group:node/add/group'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/group', @@ -448,8 +450,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_harvest-source:node/add/harvest-source. + // Exported menu link: menu-command-center-menu_harvest-source:node/add/harvest-source. $menu_links['menu-command-center-menu_harvest-source:node/add/harvest-source'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/harvest-source', @@ -466,12 +467,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => 0, + 'weight' => -44, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_manage-users:admin/people. + // Exported menu link: menu-command-center-menu_manage-users:admin/people. $menu_links['menu-command-center-menu_manage-users:admin/people'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/people', @@ -488,12 +488,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => 0, + 'weight' => -49, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_people:admin/people', ); - // Exported menu link: - // menu-command-center-menu_menus:admin/structure/menu. + // Exported menu link: menu-command-center-menu_menus:admin/structure/menu. $menu_links['menu-command-center-menu_menus:admin/structure/menu'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/structure/menu', @@ -510,12 +509,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -48, + 'weight' => -49, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', ); - // Exported menu link: - // menu-command-center-menu_open-data-schema-mapper:admin/config/services/odsm. + // Exported menu link: menu-command-center-menu_open-data-schema-mapper:admin/config/services/odsm. $menu_links['menu-command-center-menu_open-data-schema-mapper:admin/config/services/odsm'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/config/services/odsm', @@ -536,8 +534,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', ); - // Exported menu link: - // menu-command-center-menu_page:node/add/page. + // Exported menu link: menu-command-center-menu_page:node/add/page. $menu_links['menu-command-center-menu_page:node/add/page'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/page', @@ -558,8 +555,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_people:admin/people. + // Exported menu link: menu-command-center-menu_people:admin/people. $menu_links['menu-command-center-menu_people:admin/people'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/people', @@ -576,11 +572,31 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 0, - 'weight' => 5, + 'weight' => -47, + 'customized' => 1, + ); + // Exported menu link: menu-command-center-menu_project-open-data-validation:admin/config/services/odsm/validate/pod. + $menu_links['menu-command-center-menu_project-open-data-validation:admin/config/services/odsm/validate/pod'] = array( + 'menu_name' => 'menu-command-center-menu', + 'link_path' => 'admin/config/services/odsm/validate/pod', + 'router_path' => 'admin/config/services/odsm/validate/pod', + 'link_title' => 'Project Open Data Validation', + 'options' => array( + 'attributes' => array( + 'title' => '', + ), + 'identifier' => 'menu-command-center-menu_project-open-data-validation:admin/config/services/odsm/validate/pod', + ), + 'module' => 'menu', + 'hidden' => 0, + 'external' => 0, + 'has_children' => 0, + 'expanded' => 0, + 'weight' => -48, 'customized' => 1, + 'parent_identifier' => 'menu-command-center-menu_open-data-schema-mapper:admin/config/services/odsm', ); - // Exported menu link: - // menu-command-center-menu_recline-configuration:admin/dkan/recline. + // Exported menu link: menu-command-center-menu_recline-configuration:admin/dkan/recline. $menu_links['menu-command-center-menu_recline-configuration:admin/dkan/recline'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/dkan/recline', @@ -597,12 +613,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -44, + 'weight' => -43, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_dkan:admin/dkan', ); - // Exported menu link: - // menu-command-center-menu_resource:node/add/resource. + // Exported menu link: menu-command-center-menu_resource:node/add/resource. $menu_links['menu-command-center-menu_resource:node/add/resource'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'node/add/resource', @@ -623,8 +638,7 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_site-configuration:admin/config. + // Exported menu link: menu-command-center-menu_site-configuration:admin/config. $menu_links['menu-command-center-menu_site-configuration:admin/config'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/config', @@ -641,11 +655,10 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 0, - 'weight' => 7, + 'weight' => -45, 'customized' => 1, ); - // Exported menu link: - // menu-command-center-menu_site-information:admin/config/system/site-information. + // Exported menu link: menu-command-center-menu_site-information:admin/config/system/site-information. $menu_links['menu-command-center-menu_site-information:admin/config/system/site-information'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/config/system/site-information', @@ -662,12 +675,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -46, + 'weight' => -50, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', ); - // Exported menu link: - // menu-command-center-menu_taxonomy:admin/structure/taxonomy. + // Exported menu link: menu-command-center-menu_taxonomy:admin/structure/taxonomy. $menu_links['menu-command-center-menu_taxonomy:admin/structure/taxonomy'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/structure/taxonomy', @@ -684,34 +696,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 0, 'expanded' => 0, - 'weight' => -45, - 'customized' => 1, - 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', - ); - // Exported menu link: - // menu-command-center-menu_theme-settings:admin/appearance/settings. - $menu_links['menu-command-center-menu_theme-settings:admin/appearance/settings'] = array( - 'menu_name' => 'menu-command-center-menu', - 'link_path' => 'admin/appearance/settings', - 'router_path' => 'admin/appearance/settings', - 'link_title' => 'Theme Settings', - 'options' => array( - 'attributes' => array( - 'title' => '', - ), - 'identifier' => 'menu-command-center-menu_theme-settings:admin/appearance/settings', - ), - 'module' => 'menu', - 'hidden' => 0, - 'external' => 0, - 'has_children' => 0, - 'expanded' => 0, - 'weight' => -44, + 'weight' => -48, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_site-configuration:admin/config', ); - // Exported menu link: menu-command-center-menu_visualization: - // admin/structure/entity-type/visualization/ve_chart/add. + // Exported menu link: menu-command-center-menu_visualization:admin/structure/entity-type/visualization/ve_chart/add. $menu_links['menu-command-center-menu_visualization:admin/structure/entity-type/visualization/ve_chart/add'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/structure/entity-type/visualization/ve_chart/add', @@ -728,12 +717,11 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 0, - 'weight' => -44, + 'weight' => -6, 'customized' => 1, 'parent_identifier' => 'menu-command-center-menu_add-content:node/add', ); - // Exported menu link: - // menu-command-center-menu_visualizations:admin/structure/entity-type/visualization. + // Exported menu link: menu-command-center-menu_visualizations:admin/structure/entity-type/visualization. $menu_links['menu-command-center-menu_visualizations:admin/structure/entity-type/visualization'] = array( 'menu_name' => 'menu-command-center-menu', 'link_path' => 'admin/structure/entity-type/visualization', @@ -750,34 +738,14 @@ function dkan_sitewide_menu_menu_default_menu_links() { 'external' => 0, 'has_children' => 1, 'expanded' => 0, - 'weight' => 4, - 'customized' => 1, - ); - // Exported menu link: menu-command-center-menu_project-open-data-validation:admin/config/services/odsm/validate/pod. - $menu_links['menu-command-center-menu_project-open-data-validation:admin/config/services/odsm/validate/pod'] = array( - 'menu_name' => 'menu-command-center-menu', - 'link_path' => 'admin/config/services/odsm/validate/pod', - 'router_path' => 'admin/config/services/odsm/validate/pod', - 'link_title' => 'Project Open Data Validation', - 'options' => array( - 'attributes' => array( - 'title' => '', - ), - 'identifier' => 'menu-command-center-menu_project-open-data-validation:admin/config/services/odsm/validate/pod', - ), - 'module' => 'menu', - 'hidden' => 0, - 'external' => 0, - 'has_children' => 0, - 'expanded' => 0, - 'weight' => 0, + 'weight' => -48, 'customized' => 1, - 'parent_identifier' => 'menu-command-center-menu_open-data-schema-mapper:admin/config/services/odsm', ); // Translatables // Included for use with string extractors like potx. t('Add content'); + t('Appearance'); t('Chart'); t('Charts'); t('Colorizer'); @@ -809,7 +777,6 @@ function dkan_sitewide_menu_menu_default_menu_links() { t('Site Configuration'); t('Site Information'); t('Taxonomy'); - t('Theme Settings'); t('Visualization'); t('Visualizations'); diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.info b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.info index 61de83fd4..4e4cc0e6d 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.info +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.info @@ -10,6 +10,7 @@ dependencies[] = menu features[features_api][] = api:2 features[menu_custom][] = menu-command-center-menu features[menu_links][] = menu-command-center-menu_add-content:node/add +features[menu_links][] = menu-command-center-menu_appearance:admin/appearance/settings features[menu_links][] = menu-command-center-menu_chart:admin/structure/entity-type/visualization/ve_chart/add features[menu_links][] = menu-command-center-menu_charts:admin/structure/entity-type/visualization/ve_chart features[menu_links][] = menu-command-center-menu_colorizer:admin/appearance/colorizer @@ -41,6 +42,5 @@ features[menu_links][] = menu-command-center-menu_resource:node/add/resource features[menu_links][] = menu-command-center-menu_site-configuration:admin/config features[menu_links][] = menu-command-center-menu_site-information:admin/config/system/site-information features[menu_links][] = menu-command-center-menu_taxonomy:admin/structure/taxonomy -features[menu_links][] = menu-command-center-menu_theme-settings:admin/appearance/settings features[menu_links][] = menu-command-center-menu_visualization:admin/structure/entity-type/visualization/ve_chart/add features[menu_links][] = menu-command-center-menu_visualizations:admin/structure/entity-type/visualization diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.install b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.install index 3a2c69025..3a2c4f596 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.install +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.install @@ -42,74 +42,3 @@ function dkan_sitewide_menu_update_7101() { } } } - -/** - * Clear command center. - * - * When we upgrade, we need to rebuild - * the command center menu completely. This - * Deletes all the existing menu links. - */ -function _dkan_sitewide_menu_clear_command_center() { - $menu_links = menu_load_links('menu-command-center-menu'); - - foreach ($menu_links as $menu_link) { - menu_link_delete($menu_link['mlid']); - } -} - -/** - * Setup menu. - * - * This helper function sets up the - * admin_menu_source module's configuration. - * We want the content creator and - * editor roles to have the "command center" - * menu rather than the whole admin - * menu in the top bar. We can't rely on the - * rid to be the same on every site so not using features. - */ -function _dkan_sitewide_menu_setup_admin_menu_source() { - $required_roles = array( - 'administrator', - 'site manager', - 'editor', - 'content creator', - ); - $roles = array_flip(user_roles()); - $admin_menu_source_settings = array(); - foreach ($required_roles as $role_name) { - if (!isset($roles[$role_name])) { - $role = new stdClass(); - $role->name = $role_name; - user_role_save($role); - $roles[$role_name] = $role->rid; - } - } - - $roles = array_flip(user_roles()); - - $admin_menu_source_settings = array( - $roles['administrator'] => array( - 'rid' => $roles['administrator'], - 'source' => '', - 'weight' => 0, - ), - $roles['site manager'] => array( - 'rid' => $roles['site manager'], - 'source' => 'menu-command-center-menu', - 'weight' => 1, - ), - $roles['editor'] => array( - 'rid' => $roles['editor'], - 'source' => 'menu-command-center-menu', - 'weight' => 2, - ), - $roles['content creator'] => array( - 'rid' => $roles['content creator'], - 'source' => 'menu-command-center-menu', - 'weight' => 3, - ), - ); - variable_set('admin_menu_source_settings', $admin_menu_source_settings); -} diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.module b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.module index 9a490b146..36c63d2ba 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.module +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_menu/dkan_sitewide_menu.module @@ -26,3 +26,74 @@ function dkan_sitewide_menu_menu_alter(&$items) { $items['admin/appearance/colorizer']['access arguments'] = array('administer DKAN configuration'); $items['admin/config/services/odsm/validate/dcat']['access arguments'] = array('administer DKAN configuration'); } + +/** + * Clear command center. + * + * When we upgrade, we need to rebuild + * the command center menu completely. This + * Deletes all the existing menu links. + */ +function _dkan_sitewide_menu_clear_command_center() { + $menu_links = menu_load_links('menu-command-center-menu'); + + foreach ($menu_links as $menu_link) { + menu_link_delete($menu_link['mlid']); + } +} + +/** + * Setup menu. + * + * This helper function sets up the + * admin_menu_source module's configuration. + * We want the content creator and + * editor roles to have the "command center" + * menu rather than the whole admin + * menu in the top bar. We can't rely on the + * rid to be the same on every site so not using features. + */ +function _dkan_sitewide_menu_setup_admin_menu_source() { + $required_roles = array( + 'administrator', + 'site manager', + 'editor', + 'content creator', + ); + $roles = array_flip(user_roles()); + $admin_menu_source_settings = array(); + foreach ($required_roles as $role_name) { + if (!isset($roles[$role_name])) { + $role = new stdClass(); + $role->name = $role_name; + user_role_save($role); + $roles[$role_name] = $role->rid; + } + } + + $roles = array_flip(user_roles()); + + $admin_menu_source_settings = array( + $roles['administrator'] => array( + 'rid' => $roles['administrator'], + 'source' => '', + 'weight' => 0, + ), + $roles['site manager'] => array( + 'rid' => $roles['site manager'], + 'source' => 'menu-command-center-menu', + 'weight' => 1, + ), + $roles['editor'] => array( + 'rid' => $roles['editor'], + 'source' => 'menu-command-center-menu', + 'weight' => 2, + ), + $roles['content creator'] => array( + 'rid' => $roles['content creator'], + 'source' => 'menu-command-center-menu', + 'weight' => 3, + ), + ); + variable_set('admin_menu_source_settings', $admin_menu_source_settings); +} diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/README.md b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/README.md index df9032286..7e727e410 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/README.md +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/README.md @@ -14,12 +14,12 @@ In this example we’ll add a new editor user to the site. ## Managing, Editing, and Deleting Existing Users -![User admin screen](http://docs.getdkan.com/sites/default/files/user_01.png) +![User admin screen](https://docs.getdkan.com/sites/default/files/user_01.png) * Visit your site’s User Management page by clicking “People” in the admin menu. * The displayed list of users on the User Management page can be filtered and sorted using the filters at the top of the page. Once you’ve found the user you wish to edit in the user table, click the “edit” link at the end of that user’s row. -![User edit screen](http://docs.getdkan.com/sites/default/files/user_02.png) +![User edit screen](https://docs.getdkan.com/sites/default/files/user_02.png) * On the resulting “edit user” page, you can edit the user’s username, email, or profile information. You can also set a new password for the user. Click the “Save” button at the bottom of the page to save your changes. * Use the “Cancel account” at the bottom of the edit user page to delete an account. You will be given the option to preserve or delete any website content added by that user before deletion. diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/dkan_sitewide_user.module b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/dkan_sitewide_user.module index 4c08c22a6..0a8226dfc 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/dkan_sitewide_user.module +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_user/dkan_sitewide_user.module @@ -6,3 +6,36 @@ */ include_once 'dkan_sitewide_user.features.inc'; + +/** + * Implements hook_user_cancel_methods_alter(). + */ +function dkan_sitewide_user_user_cancel_methods_alter(&$methods) { + // Assigning unpublished content to the anonymous role + // will make it visible to anonymous users. + unset($methods['user_cancel_reassign']); + // Add a custom method. + $methods['dkan_sitewide_user_assign_to_admin'] = array( + 'title' => t('Disable the account and make its content belong to the admin user.'), + 'description' => t('All contents will be assigned to admin user.'), + 'access' => user_access('administer users'), + ); +} + +/** + * Implements hook_user_cancel(). + */ +function dkan_sitewide_user_user_cancel($edit, $account, $method) { + switch ($method) { + case 'dkan_sitewide_user_assign_to_admin': + // Assign nodes to admin user. + module_load_include('inc', 'node', 'node.admin'); + $nodes = db_select('node', 'n') + ->fields('n', array('nid')) + ->condition('uid', $account->uid) + ->execute() + ->fetchCol(); + node_mass_update($nodes, array('uid' => 1)); + break; + } +} diff --git a/dkan/modules/dkan/dkan_topics/dkan_topics.info b/dkan/modules/dkan/dkan_topics/dkan_topics.info index ea7c562a5..60b6c229c 100755 --- a/dkan/modules/dkan/dkan_topics/dkan_topics.info +++ b/dkan/modules/dkan/dkan_topics/dkan_topics.info @@ -57,4 +57,4 @@ features_exclude[dependencies][dkan_dataset_groups] = dkan_dataset_groups features_exclude[dependencies][dkan_topics] = dkan_topics no autodetect = 1 project path = profiles/dkan/modules/dkan -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/dkan_topics/dkan_topics.install b/dkan/modules/dkan/dkan_topics/dkan_topics.install index efde72e13..f51ceb405 100755 --- a/dkan/modules/dkan/dkan_topics/dkan_topics.install +++ b/dkan/modules/dkan/dkan_topics/dkan_topics.install @@ -71,12 +71,12 @@ function dkan_topics_install() { } } $message = <<<EOF -'You have just enabled the DKAN Topics module. Most likely you are +t('You have just enabled the DKAN Topics module. Most likely you are starting with an empty Topics vocabulary. To load sample topics, enable the additional DKAN Default Topics module. <a href="@topics_admin">Click here to -manage the Topics vocabulary yourself.</a>' +manage the Topics vocabulary yourself.</a>') EOF; - drupal_set_message(t($message, array('@topics_admin' => 'admin/structure/taxonomy/dkan_topics'))); + drupal_set_message($message, array('@topics_admin' => 'admin/structure/taxonomy/dkan_topics')); // Set up fonts. module_load_include('inc', 'font_icon_select', 'font_icon_select.admin'); @@ -138,7 +138,7 @@ function dkan_topics_uninstall() { }; } // Purge all field infromation - // http://api.drupal.org/api/function/field_purge_batch/7 + // https://api.drupal.org/api/function/field_purge_batch/7 field_purge_batch(1000); menu_rebuild(); } diff --git a/dkan/modules/dkan/dkan_workflow/dkan_workflow.info b/dkan/modules/dkan/dkan_workflow/dkan_workflow.info index 4c98d3abe..ea0afa11d 100644 --- a/dkan/modules/dkan/dkan_workflow/dkan_workflow.info +++ b/dkan/modules/dkan/dkan_workflow/dkan_workflow.info @@ -44,4 +44,4 @@ features[workbench_moderation_transitions][] = needs_review:published features[workbench_moderation_transitions][] = published:needs_review features_exclude[dependencies][ctools] = ctools features_exclude[dependencies][dkan_dataset_content_types] = dkan_dataset_content_types -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_agencies.php b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_agencies.php index e8cd2ce54..3e52c9ed8 100644 --- a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_agencies.php +++ b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_agencies.php @@ -3,7 +3,7 @@ /** * @file * Array of federal agencies produced by Federal Inventory Program. - * @see http://project-open-data.github.io/schema/#programCode + * @see https://project-open-data.github.io/schema/#programCode */ $federal_inventory_agency_list = array( diff --git a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_codes.php b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_codes.php index 58319769f..69b4a40b2 100644 --- a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_codes.php +++ b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_codes.php @@ -3,7 +3,7 @@ /** * @file * Array of federal agency codes produced by Federal Inventory Program. - * @see http://project-open-data.github.io/schema/#programCode + * @see https://project-open-data.github.io/schema/#programCode */ $federal_inventory_full_list = array( diff --git a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_list.php b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_list.php index 8a00c47c4..ab398402d 100644 --- a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_list.php +++ b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/federal_inventory_list.php @@ -3,7 +3,7 @@ /** * @file * Key/Vallue array of federal agencies produced by Federal Inventory Program. - * @see http://project-open-data.github.io/schema/#programCode + * @see https://project-open-data.github.io/schema/#programCode */ $federal_inventory_small_list = array( diff --git a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/list_to_array.php b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/list_to_array.php index 024f381e9..4586f0673 100644 --- a/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/list_to_array.php +++ b/dkan/modules/dkan/open_data_federal_extras/fed_program_code_list/list_to_array.php @@ -27,7 +27,7 @@ function opfe_list_to_array_process_agencies() { /** * @file * Array of federal agencies produced by Federal Inventory Program. - * @see http://project-open-data.github.io/schema/#programCode + * @see https://project-open-data.github.io/schema/#programCode */ $federal_inventory_agency_list = '; @@ -55,7 +55,7 @@ function opfe_list_to_array_process_codes() { /** * @file * Array of federal agency codes produced by Federal Inventory Program. - * @see http://project-open-data.github.io/schema/#programCode + * @see https://project-open-data.github.io/schema/#programCode */ $federal_inventory_full_list = '; @@ -64,7 +64,7 @@ function opfe_list_to_array_process_codes() { /** * @file * Key/Vallue array of federal agencies produced by Federal Inventory Program. - * @see http://project-open-data.github.io/schema/#programCode + * @see https://project-open-data.github.io/schema/#programCode */ $federal_inventory_small_list = '; diff --git a/dkan/modules/dkan/open_data_federal_extras/open_data_federal_extras.info b/dkan/modules/dkan/open_data_federal_extras/open_data_federal_extras.info index 146934151..27f741e63 100644 --- a/dkan/modules/dkan/open_data_federal_extras/open_data_federal_extras.info +++ b/dkan/modules/dkan/open_data_federal_extras/open_data_federal_extras.info @@ -27,4 +27,4 @@ features[field_instance][] = node-dataset-field_odfe_data_quality features[field_instance][] = node-dataset-field_odfe_investment_uii features[field_instance][] = node-dataset-field_odfe_program_code features[field_instance][] = node-dataset-field_odfe_system_of_records -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/modules/dkan/open_data_schema_map_dkan/open_data_schema_map_dkan.info b/dkan/modules/dkan/open_data_schema_map_dkan/open_data_schema_map_dkan.info index d45c751fd..3544809e2 100644 --- a/dkan/modules/dkan/open_data_schema_map_dkan/open_data_schema_map_dkan.info +++ b/dkan/modules/dkan/open_data_schema_map_dkan/open_data_schema_map_dkan.info @@ -21,4 +21,4 @@ features[open_data_schema_apis][] = data_json_1_1 features[open_data_schema_apis][] = dcat_ap_v1_1_dataset features[open_data_schema_apis][] = dcat_v1_1 features[open_data_schema_apis][] = dcat_v1_1_json -version = 7.x-1.14.5 +version = 7.x-1.15 diff --git a/dkan/patches/dkan_linkchecker_file.patch b/dkan/patches/dkan_linkchecker_file.patch new file mode 100644 index 000000000..da9a3444e --- /dev/null +++ b/dkan/patches/dkan_linkchecker_file.patch @@ -0,0 +1,38 @@ +diff --git a/linkchecker.module b/linkchecker.module +index b7bbe3e..9b4b440 100644 +--- a/linkchecker.module ++++ b/linkchecker.module +@@ -333,6 +333,7 @@ function _linkchecker_link_node_ids($link, $node_author_account = NULL) { + 'text_long', + 'text', + 'link_field', ++ 'file', + ); + + // Only check link and text fields, since those are the only types we +@@ -1774,6 +1775,26 @@ function _linkchecker_parse_fields($entity_type, $bundle_name, $entity, $return_ + } + } + break; ++ ++ // File module field. ++ case 'file': ++ foreach ($entity_field as $language) { ++ foreach ($language as $item) { ++ $item += array( ++ 'title' => '', ++ ); ++ if (isset($item['uri'])) { ++ $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $item['uri']); ++ $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); ++ } ++ elseif (isset($item['filefield_dkan_remotefile']['url'])) { ++ $text_items[] = $text_items_by_field[$field['field_name']][] = l($item['title'], $item['filefield_dkan_remotefile']['url']); ++ $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['title'], NULL, linkchecker_entity_language($entity_type, $entity), TRUE); ++ } ++ } ++ } ++ break; ++ + } + } diff --git a/dkan/test/behat.yml b/dkan/test/behat.yml index 4278c3b55..d69126d83 100644 --- a/dkan/test/behat.yml +++ b/dkan/test/behat.yml @@ -1,8 +1,8 @@ ---- -default: - suites: - dkan: - contexts: +--- +default: + suites: + dkan: + contexts: - FeatureContext - Drupal\DrupalExtension\Context\MinkContext - Drupal\DrupalExtension\Context\DrupalContext @@ -16,8 +16,9 @@ default: - Drupal\DKANExtension\Context\HarvestSourceContext - Drupal\DKANExtension\Context\WorkflowContext - Drupal\DKANExtension\Context\DatasetAutoFillContext - - Drupal\DKANExtension\Context\DatasetContext: - - fields: + - Drupal\DKANExtension\Context\LinkcheckerContext + - Drupal\DKANExtension\Context\DatasetContext: + - fields: title: title description: body published: status @@ -35,7 +36,7 @@ default: doi: field_doi citation: field_citation publisher: og_group_ref - - labels: + - labels: title: Title body: Description field_tags: Tags @@ -57,36 +58,36 @@ default: field_conforms_to: Data Standard field_language: Language og_group_ref: Groups - - sets: + - sets: field_spatial: Spatial / Geographical Coverage Area field_temporal_coverage: Temporal Coverage - - defaults: + - defaults: field_public_access_level: public field_hhs_attestation_negative: 1 field_license: odc-by - Drupal\DKANExtension\Context\DataDashboardContext - Drupal\DKANExtension\Context\PODContext - Drupal\DKANExtension\Context\FastImportContext - - Drupal\DKANExtension\Context\SearchAPIContext: - search_forms: - default: + - Drupal\DKANExtension\Context\SearchAPIContext: + search_forms: + default: form_css: "#dkan-sitewide-dataset-search-form" - form_field: "edit-search" - form_button: "edit-submit" - results_css: ".view-dkan-datasets" - result_item_css: ".views-row" - harvest_source: - results_css: ".view-dkan-harvest-source-search" - result_item_css: ".views-row" + form_field: edit-search + form_button: edit-submit + results_css: .view-dkan-datasets + result_item_css: .views-row + harvest_source: + results_css: .view-dkan-harvest-source-search + result_item_css: .views-row - Drupal\DKANExtension\Context\ResourceContext - - Drupal\DKANExtension\Context\ServicesContext: - - request_fields_map: - resource: + - Drupal\DKANExtension\Context\ServicesContext: + - request_fields_map: + resource: type: type title: title body: body[und][0][value] status: status - dataset: + dataset: type: type title: title status: status @@ -114,93 +115,93 @@ default: - Drupal\DKANExtension\Context\DatastoreContext - Drupal\DKANExtension\Context\TimezoneContext - Drupal\DrupalExtension\Context\DrushContext - - Devinci\DevinciExtension\Context\DebugContext: + - Devinci\DevinciExtension\Context\DebugContext: asset_dump_path: "%paths.base%/assets" - - Devinci\DevinciExtension\Context\JavascriptContext: + - Devinci\DevinciExtension\Context\JavascriptContext: maximum_wait: 30 - formatters: - pretty: - output_styles: - comment: + formatters: + pretty: + output_styles: + comment: - default - default - [conceal] - gherkin: - filters: + gherkin: + filters: tags: ~@fixme - extensions: - Behat\MinkExtension: - goutte: - guzzle_parameters: + extensions: + Behat\MinkExtension: + goutte: + guzzle_parameters: verify: false - selenium2: [] - default_session: "goutte" - javascript_session: "selenium2" + default_session: goutte + javascript_session: selenium2 browser_name: chrome files_path: "%paths.base%/files" - Drupal\DrupalExtension: - blackbox: - drupal: + Drupal\DrupalExtension: + blackbox: + drupal: drupal_root: "%paths.base%/../../docroot" - api_driver: "drupal" - region_map: + api_driver: drupal + region_map: admin menu: "#admin-menu" - breadcrumb: ".breadcrumb" - comment: ".comment-main" - content search: ".form-item-query" - content: ".region-content" - close-modal: ".ctools-close-modal" - dashboards: ".view-data-dashboards table tbody" - dataset body: ".field-name-body" + breadcrumb: .breadcrumb + comment: .comment-main + content search: .form-item-query + content: .region-content + close-modal: .ctools-close-modal + dashboards: .view-data-dashboards table tbody + dataset body: .field-name-body dataset edit body: "#edit-body" dataset resource list: "#data-and-resources" dataset spatial: "#edit-field-spatial" - dataset title: ".pane-node .pane-title" - datasets: ".view-dkan-datasets" - dropdown_links: ".comment-main .links.inline.dropdown-menu" - facet container: ".radix-layouts-sidebar" - filter by author: ".facetapi-facet-author" - filter by date changed: ".facetapi-facet-changed" - filter by resource format: ".facetapi-facet-field-resourcesfield-format" - filter by tag: ".facetapi-facet-field-tags" - filter by topics: ".facetapi-facet-field-topic" + dataset title: .pane-node .pane-title + datasets: .view-dkan-datasets + dropdown_links: .comment-main .links.inline.dropdown-menu + facet container: .radix-layouts-sidebar + filter by author: .facetapi-facet-author + filter by date changed: .facetapi-facet-changed + filter by resource format: .facetapi-facet-field-resourcesfield-format + filter by tag: .facetapi-facet-field-tags + filter by topics: .facetapi-facet-field-topic footer: "#footer" - group block: ".pane-views-group-block-block" - group members: ".view-id-dkan_og_extras_group_members" - group subscribe: ".group-subscribe-message" - groups: ".view-content" - harvest datasets: ".view-dkan-harvest-datasets" + group block: .pane-views-group-block-block + group members: .view-id-dkan_og_extras_group_members + group subscribe: .group-subscribe-message + groups: .view-content + harvest datasets: .view-dkan-harvest-datasets header: "#header" left header: "#header-left" - left_sidebar: ".panel-col-first" + left_sidebar: .panel-col-first modal: "#modalContent" - navigation: ".navigation-wrapper" - other access: ".pane-dkan-sitewide-dkan-sitewide-other-access" - primary tabs: ".tabs--primary" - recline preview: ".recline-data-explorer" + navigation: .navigation-wrapper + other access: .pane-dkan-sitewide-dkan-sitewide-other-access + page header: .page-header + primary tabs: .tabs--primary + recline preview: .recline-data-explorer resource groups: "#edit-groups" - resource title: ".pane-node .pane-title" - results: ".view-header" + resource title: .pane-node .pane-title + results: .view-header right header: "#header-right" right sidebar: "#column-right" - search content results: ".content" - search_area: ".panel-col-last" - social: ".pane-dkan-sitewide-dkan-sitewide-social" - tabs: ".field-group-htabs-wrapper" - toolbar: ".tabs--primary" - user block: ".pane-views-user-profile-fields-block" - user command center: ".pane-dkan-sitewide-profile-page-dkan-user-summary" - user content: ".view-user-profile-search" - user page: ".main" - user profile: ".pane-dkan-sitewide-panels-dkan-user-summary" - text: - log_out: "Log out" - log_in: "Log in" - selectors: - message_selector: ".alert" - error_message_selector: ".alert.alert-error" - success_message_selector: ".alert.alert-success" - Drupal\DKANExtension: - some_param: "test" + search content results: .content + search_area: .panel-col-last + social: .pane-dkan-sitewide-dkan-sitewide-social + tabs: .field-group-htabs-wrapper + toolbar: .tabs--primary + user block: .pane-views-user-profile-fields-block + user command center: .pane-dkan-sitewide-profile-page-dkan-user-summary + user content: .view-user-profile-search + user page: .main + user profile: .pane-dkan-sitewide-panels-dkan-user-summary + text: + log_out: Log out + log_in: Log in + selectors: + message_selector: .alert + error_message_selector: .alert.alert-error + success_message_selector: .alert.alert-success + Drupal\DKANExtension: + some_param: test diff --git a/dkan/test/composer.json b/dkan/test/composer.json index 02ce6c590..e49103687 100644 --- a/dkan/test/composer.json +++ b/dkan/test/composer.json @@ -1,21 +1,31 @@ { + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/GetDKAN/dkan_api_client.git" + } + ], "require": { - "phpunit/phpunit": " 5.7.*", + "phpunit/phpunit": "5.7.*", "behat/behat": "3.1.*@dev", "devinci/devinci-behat-extension": "dev-master", "myplanetdigital/function_mock": "dev-master", "drupal/drupal-driver": "^1.2", "drupal/drupal-extension": "~3.0", - "squizlabs/php_codesniffer": "*", - "drupal/coder": "~8.2" + "squizlabs/php_codesniffer": "^2.7.0", + "drupal/coder": "8.2.10", + "guzzlehttp/guzzle": "^6.3", + "dkan/dkan_api_client": "1.0.0" }, "autoload": { "psr-0": { "Drupal\\DKANExtension\\": "dkanextension/src/" - }, - "drupal/coder": "~8.2" + } }, "config": { - "bin-dir": "bin/" + "bin-dir": "bin/", + "platform": { + "php": "5.6.23" + } } } diff --git a/dkan/test/composer.lock b/dkan/test/composer.lock index 0d40d1851..1684d46c2 100644 --- a/dkan/test/composer.lock +++ b/dkan/test/composer.lock @@ -1,11 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "hash": "a4f9fc4b2b541dfa8108402ecba002fc", - "content-hash": "53f2fed63843d623f643a653ae3e0450", + "content-hash": "26bf28e6750b11dba8e69a9395de9055", "packages": [ { "name": "behat/behat", @@ -85,20 +84,20 @@ "symfony", "testing" ], - "time": "2016-03-28 07:04:45" + "time": "2016-03-28T07:04:45+00:00" }, { "name": "behat/gherkin", - "version": "v4.4.5", + "version": "v4.5.1", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74" + "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74", - "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a", + "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a", "shasum": "" }, "require": { @@ -144,7 +143,7 @@ "gherkin", "parser" ], - "time": "2016-10-30 11:50:56" + "time": "2017-08-30T11:04:43+00:00" }, { "name": "behat/mink", @@ -202,7 +201,7 @@ "testing", "web" ], - "time": "2016-03-05 08:26:18" + "time": "2016-03-05T08:26:18+00:00" }, { "name": "behat/mink-browserkit-driver", @@ -258,31 +257,31 @@ "browser", "testing" ], - "time": "2016-03-05 08:59:47" + "time": "2016-03-05T08:59:47+00:00" }, { "name": "behat/mink-extension", - "version": "v2.2", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/Behat/MinkExtension.git", - "reference": "5b4bda64ff456104564317e212c823e45cad9d59" + "reference": "80f7849ba53867181b7e412df9210e12fba50177" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/MinkExtension/zipball/5b4bda64ff456104564317e212c823e45cad9d59", - "reference": "5b4bda64ff456104564317e212c823e45cad9d59", + "url": "https://api.github.com/repos/Behat/MinkExtension/zipball/80f7849ba53867181b7e412df9210e12fba50177", + "reference": "80f7849ba53867181b7e412df9210e12fba50177", "shasum": "" }, "require": { - "behat/behat": "~3.0,>=3.0.5", - "behat/mink": "~1.5", + "behat/behat": "^3.0.5", + "behat/mink": "^1.5", "php": ">=5.3.2", - "symfony/config": "~2.2|~3.0" + "symfony/config": "^2.7|^3.0|^4.0" }, "require-dev": { - "behat/mink-goutte-driver": "~1.1", - "phpspec/phpspec": "~2.0" + "behat/mink-goutte-driver": "^1.1", + "phpspec/phpspec": "^2.0" }, "type": "behat-extension", "extra": { @@ -317,7 +316,7 @@ "test", "web" ], - "time": "2016-02-15 07:55:18" + "time": "2018-02-06T15:36:30+00:00" }, { "name": "behat/mink-goutte-driver", @@ -372,7 +371,7 @@ "headless", "testing" ], - "time": "2016-03-05 09:04:22" + "time": "2016-03-05T09:04:22+00:00" }, { "name": "behat/mink-selenium2-driver", @@ -433,29 +432,33 @@ "testing", "webdriver" ], - "time": "2016-03-05 09:10:18" + "time": "2016-03-05T09:10:18+00:00" }, { "name": "behat/transliterator", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/Behat/Transliterator.git", - "reference": "868e05be3a9f25ba6424c2dd4849567f50715003" + "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Transliterator/zipball/868e05be3a9f25ba6424c2dd4849567f50715003", - "reference": "868e05be3a9f25ba6424c2dd4849567f50715003", + "url": "https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c", + "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "chuyskywalker/rolling-curl": "^3.1", + "php-yaoi/php-yaoi": "^1.0" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -473,7 +476,7 @@ "slug", "transliterator" ], - "time": "2015-09-28 16:26:35" + "time": "2017-04-04T11:38:05+00:00" }, { "name": "devinci/devinci-behat-extension", @@ -517,7 +520,47 @@ "Behat", "test" ], - "time": "2016-06-21 17:28:28" + "time": "2016-06-21T17:28:28+00:00" + }, + { + "name": "dkan/dkan_api_client", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/GetDKAN/dkan_api_client.git", + "reference": "009b7e023b21f6bdbf43960beacce22c90f876b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GetDKAN/dkan_api_client/zipball/009b7e023b21f6bdbf43960beacce22c90f876b9", + "reference": "009b7e023b21f6bdbf43960beacce22c90f876b9", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3", + "php": ">=5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "DKAN\\": "src/" + } + }, + "license": [ + "GPLv2" + ], + "authors": [ + { + "name": "fmizzell", + "email": "fmizzell@1312210.no-reply.drupal.org" + } + ], + "description": "A PHP client to interact with the DKAN services API.", + "support": { + "source": "https://github.com/GetDKAN/dkan_api_client/tree/1.0.0", + "issues": "https://github.com/GetDKAN/dkan_api_client/issues" + }, + "time": "2018-02-04T18:35:16+00:00" }, { "name": "doctrine/instantiator", @@ -571,32 +614,26 @@ "constructor", "instantiate" ], - "time": "2015-06-14 21:17:01" + "time": "2015-06-14T21:17:01+00:00" }, { "name": "drupal/coder", - "version": "8.2.12", + "version": "8.2.10", "source": { "type": "git", - "url": "https://github.com/klausi/coder.git", - "reference": "984c54a7b1e8f27ff1c32348df69712afd86b17f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/klausi/coder/zipball/984c54a7b1e8f27ff1c32348df69712afd86b17f", - "reference": "984c54a7b1e8f27ff1c32348df69712afd86b17f", - "shasum": "" + "url": "https://git.drupal.org/project/coder.git", + "reference": "c835ff5c1733676fe0d3f3b861e814d570baaa6f" }, "require": { "ext-mbstring": "*", "php": ">=5.4.0", - "squizlabs/php_codesniffer": ">=2.8.1 <3.0", + "squizlabs/php_codesniffer": ">=2.7.0 <3.0", "symfony/yaml": ">=2.0.0" }, "require-dev": { - "phpunit/phpunit": ">=3.7 <6" + "phpunit/phpunit": ">=3.7" }, - "type": "phpcodesniffer-standard", + "type": "library", "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-2.0+" @@ -608,29 +645,103 @@ "phpcs", "standards" ], - "time": "2017-03-18 10:28:49" + "time": "2016-12-09T21:57:53+00:00" + }, + { + "name": "drupal/core-render", + "version": "8.5.3", + "source": { + "type": "git", + "url": "https://github.com/drupal/core-render.git", + "reference": "168566d2d6b3465dc23249e97832330e4e628ea0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/drupal/core-render/zipball/168566d2d6b3465dc23249e97832330e4e628ea0", + "reference": "168566d2d6b3465dc23249e97832330e4e628ea0", + "shasum": "" + }, + "require": { + "drupal/core-utility": "^8.2", + "php": ">=5.5.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Drupal\\Component\\Render\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Renders placeholder variables for HTML and plain-text display.", + "homepage": "https://www.drupal.org/project/drupal", + "keywords": [ + "drupal" + ], + "time": "2018-02-01T21:35:01+00:00" + }, + { + "name": "drupal/core-utility", + "version": "8.5.3", + "source": { + "type": "git", + "url": "https://github.com/drupal/core-utility.git", + "reference": "affc9c7697820cc04f86d680914aa6d0d479935c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/drupal/core-utility/zipball/affc9c7697820cc04f86d680914aa6d0d479935c", + "reference": "affc9c7697820cc04f86d680914aa6d0d479935c", + "shasum": "" + }, + "require": { + "drupal/core-render": "^8.2", + "paragonie/random_compat": "^1.0|^2.0", + "php": ">=5.5.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Drupal\\Component\\Utility\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Mostly static utility classes for string, xss, array, image, and other commonly needed manipulations.", + "homepage": "https://www.drupal.org/project/drupal", + "keywords": [ + "drupal" + ], + "time": "2018-02-07T14:32:13+00:00" }, { "name": "drupal/drupal-driver", - "version": "v1.2.1", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/jhedstrom/DrupalDriver.git", - "reference": "125d39918c97f7a08e3110d456a0a1db864dae46" + "reference": "919c6a39ef6a17bdcaf81dcff97b117ecfb6061c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jhedstrom/DrupalDriver/zipball/125d39918c97f7a08e3110d456a0a1db864dae46", - "reference": "125d39918c97f7a08e3110d456a0a1db864dae46", + "url": "https://api.github.com/repos/jhedstrom/DrupalDriver/zipball/919c6a39ef6a17bdcaf81dcff97b117ecfb6061c", + "reference": "919c6a39ef6a17bdcaf81dcff97b117ecfb6061c", "shasum": "" }, "require": { + "drupal/core-utility": "^8.4", + "php": ">=5.5.9", "symfony/dependency-injection": "~2.6|~3.0", "symfony/process": "~2.5|~3.0" }, "require-dev": { "drupal/coder": "~8.2.0", "drush-ops/behat-drush-endpoint": "*", + "jakub-onderka/php-parallel-lint": "^0.9.2", "mockery/mockery": "0.9.4", "phpspec/phpspec": "~2.0", "phpunit/phpunit": "~4.0" @@ -643,14 +754,13 @@ }, "autoload": { "psr-0": { - "Drupal\\Component": "src/", "Drupal\\Driver": "src/", "Drupal\\Tests\\Driver": "tests/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -665,20 +775,20 @@ "test", "web" ], - "time": "2016-06-20 16:29:51" + "time": "2018-02-09T18:02:28+00:00" }, { "name": "drupal/drupal-extension", - "version": "v3.2.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/jhedstrom/drupalextension.git", - "reference": "abe3a33abd94382ab62423dd972fa820c63962e3" + "reference": "0ab44c8dda608b9885a53640882914a18992b6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jhedstrom/drupalextension/zipball/abe3a33abd94382ab62423dd972fa820c63962e3", - "reference": "abe3a33abd94382ab62423dd972fa820c63962e3", + "url": "https://api.github.com/repos/jhedstrom/drupalextension/zipball/0ab44c8dda608b9885a53640882914a18992b6b6", + "reference": "0ab44c8dda608b9885a53640882914a18992b6b6", "shasum": "" }, "require": { @@ -726,28 +836,31 @@ "test", "web" ], - "time": "2016-06-30 21:12:18" + "time": "2017-06-08T18:32:33+00:00" }, { "name": "fabpot/goutte", - "version": "v3.2.1", + "version": "v3.2.2", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/Goutte.git", - "reference": "db5c28f4a010b4161d507d5304e28a7ebf211638" + "reference": "395f61d7c2e15a813839769553a4de16fa3b3c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/db5c28f4a010b4161d507d5304e28a7ebf211638", - "reference": "db5c28f4a010b4161d507d5304e28a7ebf211638", + "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/395f61d7c2e15a813839769553a4de16fa3b3c96", + "reference": "395f61d7c2e15a813839769553a4de16fa3b3c96", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^6.0", "php": ">=5.5.0", - "symfony/browser-kit": "~2.1|~3.0", - "symfony/css-selector": "~2.1|~3.0", - "symfony/dom-crawler": "~2.1|~3.0" + "symfony/browser-kit": "~2.1|~3.0|~4.0", + "symfony/css-selector": "~2.1|~3.0|~4.0", + "symfony/dom-crawler": "~2.1|~3.0|~4.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.3 || ^4" }, "type": "application", "extra": { @@ -758,7 +871,10 @@ "autoload": { "psr-4": { "Goutte\\": "Goutte" - } + }, + "exclude-from-classmap": [ + "Goutte/Tests" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -775,20 +891,20 @@ "keywords": [ "scraper" ], - "time": "2017-01-03 13:21:43" + "time": "2017-11-19T08:45:40+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.2.3", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006" + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006", - "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -798,13 +914,16 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -837,7 +956,7 @@ "rest", "web service" ], - "time": "2017-02-28 22:50:30" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -888,7 +1007,7 @@ "keywords": [ "promise" ], - "time": "2016-12-20 10:07:11" + "time": "2016-12-20T10:07:11+00:00" }, { "name": "guzzlehttp/psr7", @@ -953,20 +1072,20 @@ "uri", "url" ], - "time": "2017-03-20 17:10:46" + "time": "2017-03-20T17:10:46+00:00" }, { "name": "instaclick/php-webdriver", - "version": "1.4.3", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/instaclick/php-webdriver.git", - "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb" + "reference": "6fa959452e774dcaed543faad3a9d1a37d803327" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/0c20707dcf30a32728fd6bdeeab996c887fdb2fb", - "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb", + "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/6fa959452e774dcaed543faad3a9d1a37d803327", + "reference": "6fa959452e774dcaed543faad3a9d1a37d803327", "shasum": "" }, "require": { @@ -974,7 +1093,8 @@ "php": ">=5.3.2" }, "require-dev": { - "satooshi/php-coveralls": "dev-master" + "phpunit/phpunit": "^4.8", + "satooshi/php-coveralls": "^1.0||^2.0" }, "type": "library", "extra": { @@ -1000,7 +1120,7 @@ { "name": "Anthon Pang", "email": "apang@softwaredevelopment.ca", - "role": "Fork maintainer" + "role": "Fork Maintainer" } ], "description": "PHP WebDriver for Selenium 2", @@ -1011,41 +1131,44 @@ "webdriver", "webtest" ], - "time": "2015-06-15 20:19:33" + "time": "2017-06-30T04:02:48+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", - "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": "^5.6 || ^7.0" }, "require-dev": { - "doctrine/collections": "1.*", - "phpunit/phpunit": "~4.1" + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" }, "type": "library", "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" - } + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", - "homepage": "https://github.com/myclabs/DeepCopy", "keywords": [ "clone", "copy", @@ -1053,7 +1176,7 @@ "object", "object graph" ], - "time": "2017-04-12 18:52:22" + "time": "2017-10-19T19:58:43+00:00" }, { "name": "myplanetdigital/function_mock", @@ -1093,20 +1216,68 @@ "description": "Framework that helps mocking functions for unit testing PHP scripts", "homepage": "https://github.com/myplanetdigital/function_mock", "abandoned": true, - "time": "2014-03-07 18:56:45" + "time": "2014-03-07T18:56:45+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v2.0.12", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2018-04-04T21:24:14+00:00" }, { "name": "phpdocumentor/reflection-common", - "version": "1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "shasum": "" }, "require": { @@ -1147,26 +1318,26 @@ "reflection", "static analysis" ], - "time": "2015-12-27 11:43:31" + "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.1.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" + "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", + "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", "shasum": "" }, "require": { - "php": ">=5.5", - "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.2.0", + "php": "^5.6 || ^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { @@ -1192,24 +1363,24 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30 07:12:33" + "time": "2017-11-10T14:09:06+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.2.1", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", "shasum": "" }, "require": { - "php": ">=5.5", + "php": "^5.5 || ^7.0", "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { @@ -1239,37 +1410,37 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-11-25 06:54:22" + "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.7.0", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", - "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1|^2.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8 || ^5.6.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -1302,7 +1473,7 @@ "spy", "stub" ], - "time": "2017-03-02 20:05:34" + "time": "2018-04-18T13:57:24+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1365,20 +1536,20 @@ "testing", "xunit" ], - "time": "2017-04-02 07:44:40" + "time": "2017-04-02T07:44:40+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.2", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", "shasum": "" }, "require": { @@ -1412,7 +1583,7 @@ "filesystem", "iterator" ], - "time": "2016-10-03 07:40:28" + "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", @@ -1453,7 +1624,7 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", @@ -1502,20 +1673,20 @@ "keywords": [ "timer" ], - "time": "2017-02-26 11:10:40" + "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", - "version": "1.4.11", + "version": "1.4.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", - "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", "shasum": "" }, "require": { @@ -1551,20 +1722,20 @@ "keywords": [ "tokenizer" ], - "time": "2017-02-27 10:12:30" + "time": "2017-12-04T08:55:13+00:00" }, { "name": "phpunit/phpunit", - "version": "5.7.20", + "version": "5.7.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b" + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3cb94a5f8c07a03c8b7527ed7468a2926203f58b", - "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", "shasum": "" }, "require": { @@ -1588,8 +1759,8 @@ "sebastian/global-state": "^1.1", "sebastian/object-enumerator": "~2.0", "sebastian/resource-operations": "~1.0", - "sebastian/version": "~1.0.3|~2.0", - "symfony/yaml": "~2.1|~3.0" + "sebastian/version": "^1.0.6|^2.0.1", + "symfony/yaml": "~2.1|~3.0|~4.0" }, "conflict": { "phpdocumentor/reflection-docblock": "3.0.2" @@ -1633,20 +1804,20 @@ "testing", "xunit" ], - "time": "2017-05-22 07:42:55" + "time": "2018-02-01T05:50:59+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", - "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", "shasum": "" }, "require": { @@ -1692,7 +1863,7 @@ "mock", "xunit" ], - "time": "2016-12-08 20:27:08" + "time": "2017-06-30T09:13:00+00:00" }, { "name": "psr/http-message", @@ -1742,7 +1913,7 @@ "request", "response" ], - "time": "2016-08-06 14:39:51" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", @@ -1789,7 +1960,7 @@ "psr", "psr-3" ], - "time": "2016-10-10 12:19:37" + "time": "2016-10-10T12:19:37+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -1834,7 +2005,7 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04 06:30:41" + "time": "2017-03-04T06:30:41+00:00" }, { "name": "sebastian/comparator", @@ -1898,7 +2069,7 @@ "compare", "equality" ], - "time": "2017-01-29 09:50:25" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", @@ -1950,7 +2121,7 @@ "keywords": [ "diff" ], - "time": "2017-05-22 07:24:03" + "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", @@ -2000,7 +2171,7 @@ "environment", "hhvm" ], - "time": "2016-11-26 07:53:53" + "time": "2016-11-26T07:53:53+00:00" }, { "name": "sebastian/exporter", @@ -2067,7 +2238,7 @@ "export", "exporter" ], - "time": "2016-11-19 08:54:04" + "time": "2016-11-19T08:54:04+00:00" }, { "name": "sebastian/global-state", @@ -2118,7 +2289,7 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/object-enumerator", @@ -2164,7 +2335,7 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-02-18 15:18:39" + "time": "2017-02-18T15:18:39+00:00" }, { "name": "sebastian/recursion-context", @@ -2217,7 +2388,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19 07:33:16" + "time": "2016-11-19T07:33:16+00:00" }, { "name": "sebastian/resource-operations", @@ -2259,7 +2430,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28 20:34:47" + "time": "2015-07-28T20:34:47+00:00" }, { "name": "sebastian/version", @@ -2302,20 +2473,20 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03 07:35:21" + "time": "2016-10-03T07:35:21+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "2.8.1", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d" + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d", - "reference": "d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62", + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62", "shasum": "" }, "require": { @@ -2380,29 +2551,29 @@ "phpcs", "standards" ], - "time": "2017-03-01 22:17:45" + "time": "2017-05-22T02:43:20+00:00" }, { "name": "symfony/browser-kit", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "2fe0caa60c1a1dfeefd0425741182687a9b382b8" + "reference": "840bb6f0d5b3701fd768b68adf7193c2d0f98f79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/2fe0caa60c1a1dfeefd0425741182687a9b382b8", - "reference": "2fe0caa60c1a1dfeefd0425741182687a9b382b8", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/840bb6f0d5b3701fd768b68adf7193c2d0f98f79", + "reference": "840bb6f0d5b3701fd768b68adf7193c2d0f98f79", "shasum": "" }, "require": { - "php": ">=5.5.9", - "symfony/dom-crawler": "~2.8|~3.0" + "php": "^5.5.9|>=7.0.8", + "symfony/dom-crawler": "~2.8|~3.0|~4.0" }, "require-dev": { - "symfony/css-selector": "~2.8|~3.0", - "symfony/process": "~2.8|~3.0" + "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/process": "~2.8|~3.0|~4.0" }, "suggest": { "symfony/process": "" @@ -2410,7 +2581,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2437,27 +2608,27 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2017-02-21 09:12:04" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/class-loader", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "c29a5bc6ca14cfff1f5e3d7781ed74b6e898d2b9" + "reference": "e63c12699822bb3b667e7216ba07fbcc3a3e203e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/c29a5bc6ca14cfff1f5e3d7781ed74b6e898d2b9", - "reference": "c29a5bc6ca14cfff1f5e3d7781ed74b6e898d2b9", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/e63c12699822bb3b667e7216ba07fbcc3a3e203e", + "reference": "e63c12699822bb3b667e7216ba07fbcc3a3e203e", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "require-dev": { - "symfony/finder": "~2.8|~3.0", + "symfony/finder": "~2.8|~3.0|~4.0", "symfony/polyfill-apcu": "~1.1" }, "suggest": { @@ -2466,7 +2637,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2493,20 +2664,20 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2017-02-18 17:28:00" + "time": "2018-01-03T07:37:34+00:00" }, { "name": "symfony/config", - "version": "v3.2.6", + "version": "v3.2.14", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "741d6d4cd1414d67d48eb71aba6072b46ba740c2" + "reference": "e5533fcc0b3dd377626153b2852707878f363728" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/741d6d4cd1414d67d48eb71aba6072b46ba740c2", - "reference": "741d6d4cd1414d67d48eb71aba6072b46ba740c2", + "url": "https://api.github.com/repos/symfony/config/zipball/e5533fcc0b3dd377626153b2852707878f363728", + "reference": "e5533fcc0b3dd377626153b2852707878f363728", "shasum": "" }, "require": { @@ -2549,20 +2720,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2017-03-01 18:18:25" + "time": "2017-04-12T14:13:17+00:00" }, { "name": "symfony/console", - "version": "v3.2.6", + "version": "v3.2.14", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "28fb243a2b5727774ca309ec2d92da240f1af0dd" + "reference": "eced439413608647aeff243038a33ea246b2b33a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/28fb243a2b5727774ca309ec2d92da240f1af0dd", - "reference": "28fb243a2b5727774ca309ec2d92da240f1af0dd", + "url": "https://api.github.com/repos/symfony/console/zipball/eced439413608647aeff243038a33ea246b2b33a", + "reference": "eced439413608647aeff243038a33ea246b2b33a", "shasum": "" }, "require": { @@ -2612,29 +2783,29 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-03-06 19:30:27" + "time": "2017-07-29T21:27:41+00:00" }, { "name": "symfony/css-selector", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c" + "reference": "519a80d7c1d95c6cc0b67f686d15fe27c6910de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/a48f13dc83c168f1253a5d2a5a4fb46c36244c4c", - "reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/519a80d7c1d95c6cc0b67f686d15fe27c6910de0", + "reference": "519a80d7c1d95c6cc0b67f686d15fe27c6910de0", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2665,37 +2836,36 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2017-02-21 09:12:04" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/debug", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "b90c9f91ad8ac37d9f114e369042d3226b34dc1a" + "reference": "9cf7c2271cfb89ef9727db1b740ca77be57bf9d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/b90c9f91ad8ac37d9f114e369042d3226b34dc1a", - "reference": "b90c9f91ad8ac37d9f114e369042d3226b34dc1a", + "url": "https://api.github.com/repos/symfony/debug/zipball/9cf7c2271cfb89ef9727db1b740ca77be57bf9d7", + "reference": "9cf7c2271cfb89ef9727db1b740ca77be57bf9d7", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "psr/log": "~1.0" }, "conflict": { "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" }, "require-dev": { - "symfony/class-loader": "~2.8|~3.0", - "symfony/http-kernel": "~2.8|~3.0" + "symfony/http-kernel": "~2.8|~3.0|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2722,20 +2892,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2017-02-18 17:28:00" + "time": "2018-04-03T05:22:50+00:00" }, { "name": "symfony/dependency-injection", - "version": "v2.8.18", + "version": "v2.8.38", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "efdbeefa454a41154fd99a6f0489f0e9cb46c497" + "reference": "3d7cbf34cd75ede7f94b9b990f85bd089e15cd55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/efdbeefa454a41154fd99a6f0489f0e9cb46c497", - "reference": "efdbeefa454a41154fd99a6f0489f0e9cb46c497", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3d7cbf34cd75ede7f94b9b990f85bd089e15cd55", + "reference": "3d7cbf34cd75ede7f94b9b990f85bd089e15cd55", "shasum": "" }, "require": { @@ -2785,28 +2955,28 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2017-02-28 12:31:05" + "time": "2018-02-19T16:23:47+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "403944e294cf4ceb3b8447f54cbad88ea7b99cee" + "reference": "1a4cffeb059226ff6bee9f48acb388faf674afff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/403944e294cf4ceb3b8447f54cbad88ea7b99cee", - "reference": "403944e294cf4ceb3b8447f54cbad88ea7b99cee", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/1a4cffeb059226ff6bee9f48acb388faf674afff", + "reference": "1a4cffeb059226ff6bee9f48acb388faf674afff", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "~2.8|~3.0" + "symfony/css-selector": "~2.8|~3.0|~4.0" }, "suggest": { "symfony/css-selector": "" @@ -2814,7 +2984,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2841,20 +3011,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2017-02-21 09:12:04" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v2.8.18", + "version": "v2.8.38", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "bb4ec47e8e109c1c1172145732d0aa468d967cd0" + "reference": "9b69aad7d4c086dc94ebade2d5eb9145da5dac8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bb4ec47e8e109c1c1172145732d0aa468d967cd0", - "reference": "bb4ec47e8e109c1c1172145732d0aa468d967cd0", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9b69aad7d4c086dc94ebade2d5eb9145da5dac8c", + "reference": "9b69aad7d4c086dc94ebade2d5eb9145da5dac8c", "shasum": "" }, "require": { @@ -2901,29 +3071,29 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2017-02-21 08:33:48" + "time": "2018-04-06T07:35:03+00:00" }, { "name": "symfony/filesystem", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "bc0f17bed914df2cceb989972c3b996043c4da4a" + "reference": "253a4490b528597aa14d2bf5aeded6f5e5e4a541" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/bc0f17bed914df2cceb989972c3b996043c4da4a", - "reference": "bc0f17bed914df2cceb989972c3b996043c4da4a", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/253a4490b528597aa14d2bf5aeded6f5e5e4a541", + "reference": "253a4490b528597aa14d2bf5aeded6f5e5e4a541", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2950,20 +3120,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-03-06 19:30:27" + "time": "2018-02-22T10:48:49+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.3.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", - "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b", + "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b", "shasum": "" }, "require": { @@ -2975,7 +3145,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -3009,29 +3179,29 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2018-01-30T19:27:44+00:00" }, { "name": "symfony/process", - "version": "v3.2.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "68bfa8c83f24c0ac04ea7193bcdcda4519f41892" + "reference": "4b7d64e852886319e93ddfdecff0d744ab87658b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/68bfa8c83f24c0ac04ea7193bcdcda4519f41892", - "reference": "68bfa8c83f24c0ac04ea7193bcdcda4519f41892", + "url": "https://api.github.com/repos/symfony/process/zipball/4b7d64e852886319e93ddfdecff0d744ab87658b", + "reference": "4b7d64e852886319e93ddfdecff0d744ab87658b", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -3058,34 +3228,35 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2017-03-04 12:23:14" + "time": "2018-04-03T05:22:50+00:00" }, { "name": "symfony/translation", - "version": "v3.2.6", + "version": "v3.3.16", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "0e1b15ce8fbf3890f4ccdac430ed5e07fdfe0690" + "reference": "90cb5ca3eb84b3053fef876e11e405fd819487fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/0e1b15ce8fbf3890f4ccdac430ed5e07fdfe0690", - "reference": "0e1b15ce8fbf3890f4ccdac430ed5e07fdfe0690", + "url": "https://api.github.com/repos/symfony/translation/zipball/90cb5ca3eb84b3053fef876e11e405fd819487fc", + "reference": "90cb5ca3eb84b3053fef876e11e405fd819487fc", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/config": "<2.8" + "symfony/config": "<2.8", + "symfony/yaml": "<3.3" }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~2.8|~3.0", "symfony/intl": "^2.8.18|^3.2.5", - "symfony/yaml": "~2.8|~3.0" + "symfony/yaml": "~3.3" }, "suggest": { "psr/log": "To use logging capability in translator", @@ -3095,7 +3266,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3122,24 +3293,24 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2017-03-04 12:23:14" + "time": "2018-01-18T14:19:00+00:00" }, { "name": "symfony/yaml", - "version": "v3.2.8", + "version": "v3.3.16", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6" + "reference": "af615970e265543a26ee712c958404eb9b7ac93d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/acec26fcf7f3031e094e910b94b002fa53d4e4d6", - "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6", + "url": "https://api.github.com/repos/symfony/yaml/zipball/af615970e265543a26ee712c958404eb9b7ac93d", + "reference": "af615970e265543a26ee712c958404eb9b7ac93d", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "require-dev": { "symfony/console": "~2.8|~3.0" @@ -3150,7 +3321,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3177,20 +3348,20 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2017-05-01 14:55:58" + "time": "2018-01-20T15:04:53+00:00" }, { "name": "webmozart/assert", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { @@ -3227,7 +3398,7 @@ "check", "validate" ], - "time": "2016-11-23 20:04:58" + "time": "2018-01-29T19:49:41+00:00" } ], "packages-dev": [], @@ -3241,5 +3412,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": [], - "platform-dev": [] + "platform-dev": [], + "platform-overrides": { + "php": "5.6.23" + } } diff --git a/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/HarvestSourceContext.php b/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/HarvestSourceContext.php index 78b255a0b..6cce86b3f 100644 --- a/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/HarvestSourceContext.php +++ b/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/HarvestSourceContext.php @@ -30,7 +30,7 @@ public function __construct() { ); } - /** + /** * @BeforeFeature */ public static function setupFeature(BeforeFeatureScope $scope) @@ -41,7 +41,7 @@ public static function setupFeature(BeforeFeatureScope $scope) } } - /** + /** * @AfterFeature */ public static function teardownFeature(AfterFeatureScope $scope) @@ -113,7 +113,7 @@ public function harvestSetup(BeforeScenarioScope $event) { $wrapper->title = $title; $wrapper->status = 1; $wrapper->field_dkan_harveset_type = 'datajson_v1_1_json'; - $wrapper->field_dkan_harvest_source_uri = 'http://s3.amazonaws.com/dkan-default-content-files/files/data_harvest_test.json'; + $wrapper->field_dkan_harvest_source_uri = 'https://s3.amazonaws.com/dkan-default-content-files/files/data_harvest_test.json'; $wrapper->field_dkan_harvest_machine_name = array( 'human' => $title, 'machine' => $machine_name, diff --git a/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/LinkcheckerContext.php b/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/LinkcheckerContext.php new file mode 100644 index 000000000..901b0fd29 --- /dev/null +++ b/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/LinkcheckerContext.php @@ -0,0 +1,61 @@ +<?php + +// @codingStandardsIgnoreFile +namespace Drupal\DKANExtension\Context; + +use Behat\Behat\Hook\Scope\BeforeFeatureScope; +use Behat\Behat\Hook\Scope\AfterFeatureScope; +use Drupal\DKANExtension\Hook\Scope\BeforeDKANEntityCreateScope; + +/** + * Defines application features from the specific context. + */ +class LinkcheckerContext extends RawDKANContext { + + protected $old_global_user; + private static $modules_before_feature = array(); + private static $users_before_feature = array(); + + /** + * @BeforeFeature @enableDKAN_Linkchecker + */ + public static function enableDKAN_Linkchecker(BeforeFeatureScope $scope) + { + self::$modules_before_feature = module_list(TRUE); + self::$users_before_feature = array_keys(entity_load('user')); + define('MAINTENANCE_MODE', 'update'); + @module_enable(array( + 'linkchecker', + 'dkan_linkchecker', + )); + + drupal_flush_all_caches(); + node_access_rebuild(TRUE); + } + + /** + * @AfterFeature @enableDKAN_Linkchecker + */ + public static function disableDKAN_Linkchecker(AfterFeatureScope $event) + { + $modules_after_feature = module_list(TRUE); + $users_after_feature = array_keys(entity_load('user')); + + $modules_to_disable = array_diff_assoc( + $modules_after_feature, + self::$modules_before_feature + ); + + $users_to_delete = array_diff_assoc( + $users_after_feature, + self::$users_before_feature + ); + + // Clean users and disable modules. + entity_delete_multiple('user', $users_to_delete); + module_disable(array_values($modules_to_disable)); + drupal_flush_all_caches(); + node_access_rebuild(TRUE); + } + +} diff --git a/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/ServicesContext.php b/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/ServicesContext.php index f06d108e6..349477494 100644 --- a/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/ServicesContext.php +++ b/dkan/test/dkanextension/src/Drupal/DKANExtension/Context/ServicesContext.php @@ -3,6 +3,7 @@ namespace Drupal\DKANExtension\Context; use Behat\Behat\Hook\Scope\BeforeScenarioScope; +use GuzzleHttp\Client as GuzzleClient; use Symfony\Component\Config\Definition\Exception\Exception; /** @@ -10,10 +11,11 @@ */ class ServicesContext extends RawDKANContext { private $base_url = ''; - private $cookie_session = ''; private $csrf_token = ''; private $endpoints = array(); + private $client; + // Each node field should be formatted properly before the information is sent on a request. // This is a map from 'Field name' -> 'Field format'. /** @@ -23,6 +25,7 @@ class ServicesContext extends RawDKANContext { public function __construct($request_fields_map = array()) { $this->request_fields_map = $request_fields_map['request_fields_map']; + $this->client = new GuzzleClient(['cookies' => true]); } /** @@ -58,27 +61,49 @@ public function endpoints($data) { public function iUseTheEndpointToLoginWithUserAndPass($endpoint, $username, $password) { // Build request URL. $request_url = $this->base_url . $this->getEndpointPath($endpoint) . '/user/login'; - // Get cookie_session and csrf_token. - $user_login = $this->services_request_user_login($request_url, $username, $password); - $this->cookie_session = $user_login['cookie_session']; - $this->csrf_token = $this->services_request_get_csrf($this->cookie_session, $user_login['curl'], $this->base_url); + + $data = array( + 'username' => $username, + 'password' => $password, + ); + + $response = $this->client->request("POST", $request_url, ['json' => $data]); + + if ($response->getStatusCode() == 200){ + $body = json_decode($response->getBody()->getContents()); + $this->csrf_token = $body->token; + } + else { + throw new \Exception("Unable to login"); + } } /** * @Given I use the :arg1 endpoint to create the nodes: */ - public function iUseTheEndpointToCreateTheNodes($endpoint, $nodes) { + public function iUseTheEndpointToCreateTheNodes($endpoint, $data) { $request_url = $this->base_url . $this->getEndpointPath($endpoint) . '/node'; // Create nodes. - foreach ($nodes->getHash() as $node_data) { - // Get node data. - $processed_data = $this->build_node_data($node_data); - // Create node. - $response = $this->services_request_create_node($processed_data, $this->csrf_token, $this->cookie_session, $request_url); - // Keep track of all created node. - $node = node_load($response->nid); - $wrapper = entity_metadata_wrapper('node', $node); - $this->dkanContext->entityStore->store('node', $processed_data['type'], $node->nid, $wrapper, $wrapper->label()); + foreach ($data->getHash() as $node_data) { + $node = $this->getNodeFromData($node_data); + + $response = $this->client->request("POST", $request_url, + [ + 'headers' => ['X-CSRF-Token' => $this->csrf_token], + 'json' => $node + ] + ); + + if ($response->getStatusCode() == '200') { + $body = json_decode($response->getBody()->getContents()); + // Keep track of all created node. + $node = node_load($body->nid); + $wrapper = entity_metadata_wrapper('node', $node); + $this->dkanContext->entityStore->store('node', $node->type, $node->nid, $wrapper, $wrapper->label()); + } + else { + throw new \Exception("Node could not be created"); + } } return TRUE; } @@ -95,23 +120,48 @@ public function iUseTheEndpointToAttachTheFileTo($endpoint, $file_name, $node_na if (!is_file($file_path)) { throw new Exception(sprintf('The file %s could not be found', $file_name)); } + + $file = curl_file_create($file_path); + // Prepare file data. $file_data = array( - "files[1]" => curl_file_create($file_path), - "field_name" => "field_upload", - // 0 -> replace 1 -> append. - "attach" => 0, + [ + 'name' => 'files[1]', + 'contents' => fopen($file->name, 'r') + ], + [ + 'name' => "field_name", + 'contents' => "field_upload" + ], + [ + 'name' => "attach", + 'contents' => 0 + ] ); - // Build request URL. + $request_url = $this->base_url . $this->getEndpointPath($endpoint) . '/node/' . $node->getIdentifier() . '/attach_file'; - // Attach file. - $this->services_request_attach_file($file_data, $this->csrf_token, $this->cookie_session, $request_url); + + $response = $this->client->request("POST", $request_url, [ + 'headers' => [ + 'X-CSRF-Token' => $this->csrf_token, + ], + 'multipart' => $file_data, + ]); + + if ($response->getStatusCode() == '200') { + return TRUE; + } + else { + throw new \Exception(sprintf('Error: %s', $response['response'])); + } } else { throw new Exception(sprintf('The resource could not be found.')); } + } - return TRUE; + private function printBody(\GuzzleHttp\Psr7\Response $response) { + print_r((array) json_decode($response->getBody()->getContents())); } /** @@ -121,21 +171,31 @@ public function iUseTheEndpointToUpdateTheNodeWith($endpoint, $node_name, $data) // Get node. $node = $this->dkanContext->entityStore->retrieve_by_name($node_name); if ($node) { - // Update nodes. foreach ($data->getHash() as $node_data) { - // Get node data. - $processed_data = $this->build_node_data($node_data, $node); - // Build request URL. + $request_url = $this->base_url . $this->getEndpointPath($endpoint) . '/node/' . $node->getIdentifier(); - // Update node. - $this->services_request_update_node($processed_data, $this->csrf_token, $this->cookie_session, $request_url); + + $node = $this->getNodeFromData($node_data); + $response = $this->client->request("PUT", $request_url, [ + 'headers' => [ + 'X-CSRF-Token' => $this->csrf_token, + ], + 'json' => $node, + ]); + + if ($response->getStatusCode() == '200') { + return TRUE; + } + else { + throw new \Exception(sprintf('Error: %s', $response['response'])); + } + break; } } else { throw new Exception(sprintf('The node could not be found.')); } return TRUE; - } /** @@ -145,221 +205,23 @@ public function iUseTheEndpointToDeleteTheNode($endpoint, $node_name) { // Get node. $node = $this->dkanContext->entityStore->retrieve_by_name($node_name); if ($node) { - // Build request URL. $request_url = $this->base_url . $this->getEndpointPath($endpoint) . '/node/' . $node->getIdentifier(); - // Delete node. - $this->services_request_delete_node($this->csrf_token, $this->cookie_session, $request_url); - } - else { - throw new Exception(sprintf('The node could not be found.')); - } - return TRUE; - } - - /** - * Get path based on endpoint name. - */ - private function getEndpointPath($endpoint_name) { - if (isset($this->endpoints[$endpoint_name])) { - return $this->endpoints[$endpoint_name]; - } - else { - throw new Exception(sprintf('The %s endpoint could not be found.', $endpoint_name)); - } - } - - /** - * Init CURL object. - */ - private function services_request_curl_init($request_url, $csrf_token = FALSE) { - // cURL. - $curl = curl_init($request_url); - if ($csrf_token) { - curl_setopt($curl, CURLOPT_HTTPHEADER, array( - 'Accept: application/json', - 'X-CSRF-Token: ' . $csrf_token, - )); - } - else { - // Accept JSON response. - curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json')); - } - // Ask to not return Header. - curl_setopt($curl, CURLOPT_HEADER, FALSE); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); - curl_setopt($curl, CURLOPT_FAILONERROR, TRUE); - return $curl; - } - - /** - * Execute CURL request and process response. - */ - private function services_request_curl_parse($curl) { - $response = array(); - - $result = curl_exec($curl); - $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); - - $response['http_code'] = $http_code; - - if ($http_code == 200) { - $response['success'] = TRUE; - $response['response'] = json_decode($result); - } - else { - $response['success'] = FALSE; - $response['response'] = curl_error($curl); - } - - return $response; - } - - /** - * Logs in user. - */ - private function services_request_user_login($request_url, $username, $password) { - // User data. - $user_data = array( - 'username' => $username, - 'password' => $password, - ); - $user_data = http_build_query($user_data); - - $curl = $this->services_request_curl_init($request_url); - // Do a regular HTTP POST. - curl_setopt($curl, CURLOPT_POST, 1); - // Set POST data. - curl_setopt($curl, CURLOPT_POSTFIELDS, $user_data); - - $response = $this->services_request_curl_parse($curl); - - if ($response['success']) { - // Define cookie session. - $cookie_session = $response['response']->session_name . '=' . $response['response']->sessid; - return array('cookie_session' => $cookie_session, 'curl' => $curl); - } - else { - throw new \Exception(sprintf('Error: %s', $response['response'])); - } - } - - /** - * Retrives CSRF token. - */ - private function services_request_get_csrf($cookie_session, $curl, $base_url) { - // GET CSRF TOKEN. - curl_setopt_array($curl, array( - CURLOPT_RETURNTRANSFER => 1, - CURLOPT_URL => $base_url . '/services/session/token', - )); - curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); - - $ret = new \stdClass(); - - $ret->response = curl_exec($curl); - $ret->error = curl_error($curl); - $ret->info = curl_getinfo($curl); - - $csrf_token = $ret->response; - return $csrf_token; - } - - /** - * Create node. - */ - private function services_request_create_node($node_data, $csrf_token, $cookie_session, $request_url) { - $node_data = http_build_query($node_data); - - $curl = $this->services_request_curl_init($request_url, $csrf_token); - // Do a regular HTTP POST. - curl_setopt($curl, CURLOPT_POST, 1); - // Set POST data. - curl_setopt($curl, CURLOPT_POSTFIELDS, $node_data); - // Use the previously saved session. - curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); - - $response = $this->services_request_curl_parse($curl); - - if ($response['success']) { - return $response['response']; - } - else { - throw new \Exception(sprintf('Error: %s', $response['response'])); - } - } - - /** - * Update node. - */ - private function services_request_update_node($node_data, $csrf_token, $cookie_session, $request_url) { - - $node_data = http_build_query($node_data); - - $curl = $this->services_request_curl_init($request_url, $csrf_token); - // Do a regular HTTP POST. - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); - // Set POST data. - curl_setopt($curl, CURLOPT_POSTFIELDS, $node_data); - // Use the previously saved session. - curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); - - $response = $this->services_request_curl_parse($curl); - - if ($response['success']) { - return $response['response']; - } - else { - throw new \Exception(sprintf('Error: %s', $response['response'])); - } - } - /** - * Attach file to node. - */ - private function services_request_attach_file($file_data, $csrf_token, $cookie_session, $request_url) { - - $curl = $this->services_request_curl_init($request_url, $csrf_token); - // Add 'Content-Type: multipart/form-data' on header. - curl_setopt($curl, CURLOPT_HTTPHEADER, array( - 'Content-Type: multipart/form-data', - 'Accept: application/json', - 'X-CSRF-Token: ' . $csrf_token, - )); - // Do a regular HTTP POST. - curl_setopt($curl, CURLOPT_POST, 1); - // Set POST data. - curl_setopt($curl, CURLOPT_POSTFIELDS, $file_data); - // Use the previously saved session. - curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); - - $response = $this->services_request_curl_parse($curl); - - if ($response['success']) { - return $response['response']; - } - else { - throw new \Exception(sprintf('Error: %s', $response['response'])); - } - } - - /** - * Delete node. - */ - private function services_request_delete_node($csrf_token, $cookie_session, $request_url) { + $response = $this->client->request("DELETE", $request_url, [ + 'headers' => [ + 'X-CSRF-Token' => $this->csrf_token, + ] + ]); - $curl = $this->services_request_curl_init($request_url, $csrf_token); - // Set POST data. - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); - // Use the previously saved session. - curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); - - $response = $this->services_request_curl_parse($curl); - - if ($response['success']) { - return $response['response']; + if ($response->getStatusCode() == '200') { + return TRUE; + } + else { + throw new \Exception(sprintf('Error: %s', $response['response'])); + } } else { - throw new \Exception(sprintf('Error: %s', $response['response'])); + throw new Exception(sprintf('The node could not be found.')); } } @@ -368,32 +230,25 @@ private function services_request_delete_node($csrf_token, $cookie_session, $req */ public function build_node_data($data, $node = NULL) { $node_data = array(); - if (!$node && !isset($data['type'])) { throw new Exception(sprintf('The "type" column is required.')); } - // Get node type. $node_type = ($node) ? $node->getBundle() : $data['type']; - // Get the rest api field map for the content type. $rest_api_fields = $this->request_fields_map[$node_type]; - if ($node_type == "dataset") { $this->datasetContext->applyMissingRequiredFields($data); } - foreach ($data as $field => $field_value) { if (isset($rest_api_fields[$field])) { $node_data[$rest_api_fields[$field]] = $this->process_field($field, $field_value); } } - // If the node is being updated then the type of node should not be modified. if ($node && isset($node_data['type'])) { unset($node_data['type']); } - return $node_data; } @@ -408,13 +263,11 @@ private function process_field($field, $field_value) { $field_value = $field_value['value']; } break; - case 'publisher': case 'groups': if (is_array($field_value)) { $field_value = $field_value[0]->nid; } - if (!is_numeric($field_value)) { $field_value = (int) db_select('node', 'n') ->fields('n', array('nid')) @@ -423,39 +276,65 @@ private function process_field($field, $field_value) { ->execute() ->fetchField(); } - if (is_array($field_value)) { $field_value = $field_value[0]->nid; } break; - case 'tags': if (is_array($field_value)) { $field_value = $field_value[0]->name; } break; - case 'program code': if (is_array($field_value)) { $field_value = $field_value[0]; } break; - case 'resource': $resource = $this->dkanContext->entityStore->retrieve_by_name($field_value); if ($resource) { $field_value = $resource->entityKey('title') . ' (' . $resource->getIdentifier() . ')'; } break; - case "attest date": if (is_numeric($field_value)) { $field_value = date('m/d/Y', (int) $field_value); } break; } - return $field_value; } + /** + * Get path based on endpoint name. + */ + private function getEndpointPath($endpoint_name) { + if (isset($this->endpoints[$endpoint_name])) { + return $this->endpoints[$endpoint_name]; + } + else { + throw new Exception(sprintf('The %s endpoint could not be found.', $endpoint_name)); + } + } + + private function getNodeFromData($data) + { + $properties = ['title', 'status', 'type']; + $node = []; + + foreach ($data as $key => $value) { + if (!in_array($key, $properties)) { + $node[$key] = [ + 'und' => [ + 0 => ['value' => $value] + ] + ]; + } else { + $node[$key] = $value; + } + } + + return $node; + } + } diff --git a/dkan/test/features/data_story.author.feature b/dkan/test/features/data_story.author.feature index 54b3e3475..6ccadc7fa 100644 --- a/dkan/test/features/data_story.author.feature +++ b/dkan/test/features/data_story.author.feature @@ -5,11 +5,11 @@ Feature: Data Stories Background: Given users: | name | mail | roles | - | Jaz | jaz@example.com | content creator | + | Jaz001 | jaz@example.com | content creator | And "dkan_data_story" content: | title | author | status | - | DKAN Data Story Test Story Post | Jaz | 1 | - | Unpublished Test Story Post | Jaz | 1 | + | DKAN Data Story Test Story Post | Jaz001 | 1 | + | Unpublished Test Story Post | Jaz001 | 1 | @customizable Scenario: Menu Item @@ -17,7 +17,7 @@ Feature: Data Stories Then I should see "Stories" Scenario: Create Story Content - And I am logged in as "Jaz" + And I am logged in as "Jaz001" When I am on "/node/add/dkan-data-story" And I fill in "edit-title" with "Test Post" And I fill in "body[und][0][value]" with "Test description" @@ -26,7 +26,7 @@ Feature: Data Stories Then I should not see "panels-ipe-region" Scenario: Edit own story content - And I am logged in as "Jaz" + And I am logged in as "Jaz001" When I am on "story/dkan-data-story-test-story-post" And I click "Edit" And I fill in "body[und][0][value]" with "Test description Update" @@ -44,7 +44,7 @@ Feature: Data Stories # Then I should see "Education" Scenario: Delete own story content - And I am logged in as "Jaz" + And I am logged in as "Jaz001" When I am on "story/dkan-data-story-test-story-post" And I click "Edit" And I press "Delete" diff --git a/dkan/test/features/dataset.all.feature b/dkan/test/features/dataset.all.feature index bc6bc1dc0..dfc484b52 100644 --- a/dkan/test/features/dataset.all.feature +++ b/dkan/test/features/dataset.all.feature @@ -28,17 +28,17 @@ Feature: Dataset Features | user | group | role on group | membership status | | John | Group 01 | administrator member | Active | And "Tags" terms: - | name | - | Health 2 | - | Gov 2 | + | name | + | gobbledygook | + | gibberish | And "Format" terms: | name | | csv 2 | | html 2 | And datasets: - | title | publisher | author | published | tags | description | - | DKANTest Dataset 01 | Group 01 | John | Yes | Health 2 | Test | - | DKANTest Dataset 02 | Group 01 | John | Yes | Gov 2 | Test | + | title | publisher | author | published | tags | description | + | DKANTest Dataset 01 | Group 01 | John | Yes | gobbledygook | Test | + | DKANTest Dataset 02 | Group 01 | John | Yes | gibberish | Test | And resources: | title | publisher | format | author | published | dataset | description | | Resource 01 | Group 01 | csv 2 | John | Yes | DKANTest Dataset 01 | | @@ -127,11 +127,19 @@ Feature: Dataset Features @dataset_all_8 Scenario: View available tag filters for datasets When I am on "Datasets Search" page + # Sites with long lists of tags will fail unless you filter first. + And I fill in "gobbledygook" for "Search" in the "datasets" region + And I press "Apply" + ## Uncomment this if you wanna use selenium. + # Then I click on the text "Tags" + # And I wait for "1" seconds + Then I should see "gobbledygook (1)" in the "filter by tag" region + And I fill in "gibberish" for "Search" in the "datasets" region + And I press "Apply" ## Uncomment this if you wanna use selenium. # Then I click on the text "Tags" # And I wait for "1" seconds - Then I should see "Health 2 (1)" in the "filter by tag" region - Then I should see "Gov 2 (1)" in the "filter by tag" region + Then I should see "gibberish (1)" in the "filter by tag" region # TODO: make sure it works when we don't have default content on. @dataset_all_9 @@ -155,7 +163,7 @@ Feature: Dataset Features And I should see "2" items in the "datasets" region ## Uncomment this if you wanna use selenium. # Then I click on the text "Tags" - When I click "Health 2" in the "filter by tag" region + When I click "gobbledygook" in the "filter by tag" region Then I should see "1 results" And I should see "1" items in the "datasets" region diff --git a/dkan/test/features/dataset.author.feature b/dkan/test/features/dataset.author.feature index b9c1d1faf..62142591e 100644 --- a/dkan/test/features/dataset.author.feature +++ b/dkan/test/features/dataset.author.feature @@ -109,8 +109,8 @@ Feature: Dataset Features @dataset_author_7 @noworkflow Scenario: Add a dataset to group that I am a member of Given datasets: - | title | author | published | description | - | Dataset 01 | Katie | Yes | | + | title | author | published | description | publisher | + | Dataset 01 | Katie | Yes | | Group 02 | Given I am logged in as "Katie" And I am on "Dataset 01" page When I click "Edit" diff --git a/dkan/test/features/datastore.feature b/dkan/test/features/datastore.feature index 4697a2178..4eb34ed2b 100644 Binary files a/dkan/test/features/datastore.feature and b/dkan/test/features/datastore.feature differ diff --git a/dkan/test/features/dkan_harvest.feature b/dkan/test/features/dkan_harvest.feature index fa1d81e84..e1953a9ff 100644 --- a/dkan/test/features/dkan_harvest.feature +++ b/dkan/test/features/dkan_harvest.feature @@ -18,7 +18,7 @@ Feature: Dkan Harvest Then I should see the text "Create Harvest Source" And I fill in "Title" with "Source 1" And I wait for "2" seconds - And I fill in "Source URI" with "http://s3.amazonaws.com/dkan-default-content-files/files/data_harvest_test.json" + And I fill in "Source URI" with "https://s3.amazonaws.com/dkan-default-content-files/files/data_harvest_test.json" And I select "Project Open Data v1.1 JSON" from "Type" And I press "Save" And I wait for "2" seconds @@ -333,15 +333,15 @@ Feature: Dkan Harvest Given users: | name | mail | status | roles | | Site manager | admin@fakeemail.com | 1 | site manager | - + And "dkan_topics" terms: | name | field_icon_type | field_topic_icon | | Topic1 | font | xe904 | | Topic2 | font | xe97b | - + And harvest sources: | title | machine name | source uri | type | author | published | topics | - | Topics source | topics_source | http://s3.amazonaws.com/dkan-default-content-files/files/data_harvest.json | datajson_v1_1_json | Site manager | Yes | Topic1, Topic2 | + | Topics source | topics_source | https://s3.amazonaws.com/dkan-default-content-files/files/data_harvest.json | datajson_v1_1_json | Site manager | Yes | Topic1, Topic2 | And The "topics_source" source is harvested And I am logged in as "Site manager" diff --git a/dkan/test/features/home.feature b/dkan/test/features/home.feature index 1510d0287..998711058 100644 --- a/dkan/test/features/home.feature +++ b/dkan/test/features/home.feature @@ -11,9 +11,9 @@ Feature: Homepage | Add dataset | /node/add/dataset | | Rebuild perms | /admin/reports/status/rebuild | - @api @javascript + @api @javascript @exceeds30seconds Scenario: Rebuild Permissions - Given I am logged in as a user with the "administrator" role + Given I am logged in as a user with the "administrator" role Given I am on the "Rebuild perms" page And I press "Rebuild permissions" And I wait for "Status report" diff --git a/dkan/test/features/linkchecker.feature b/dkan/test/features/linkchecker.feature new file mode 100644 index 000000000..b8ca5dcfe --- /dev/null +++ b/dkan/test/features/linkchecker.feature @@ -0,0 +1,16 @@ +@api @enableDKAN_Linkchecker @disablecaptcha +Feature: + Linkchecker tests for DKAN Linkchecker Module + + Background: + Given users: + | name | mail | roles | + | John | john@example.com | site manager | + + @linkchecker_01 + Scenario: As a site manager I should have access to the link checker config and report pages. + Given I am logged in as "John" + When I click "Link Checker Settings" in the "admin menu" region + Then I should see "General settings" + When I click "Broken Links Report" in the "admin menu" region + Then I should see "Broken Links Report" in the "page header" region diff --git a/dkan/test/features/panels.feature b/dkan/test/features/panels.feature index 2ae7beefd..c5cfdc7a0 100644 --- a/dkan/test/features/panels.feature +++ b/dkan/test/features/panels.feature @@ -18,6 +18,8 @@ Feature: Panels And I fill in "edit-body-value" with "Custom item body." And I press "Finish" And I wait and press "Save" + # Avoid unexpected alert open: with next two lines. + And I wait for "5" seconds And I wait for "New Custom Item" @api @javascript diff --git a/dkan/test/features/recline.feature b/dkan/test/features/recline.feature index a01aa82cc..7762b07bb 100644 --- a/dkan/test/features/recline.feature +++ b/dkan/test/features/recline.feature @@ -56,7 +56,7 @@ Feature: Recline Then I should see "Test R1" When I click "Edit" And I click "Remote file" - And I fill in "edit-field-link-remote-file-und-0-filefield-dkan-remotefile-url" with "http://s3.amazonaws.com/dkan-default-content-files/files/Polling_Places_Madison_0.csv" + And I fill in "edit-field-link-remote-file-und-0-filefield-dkan-remotefile-url" with "https://s3.amazonaws.com/dkan-default-content-files/files/Polling_Places_Madison_0.csv" And I press "edit-submit" Then I should see "Polling_Places_Madison_0.csv" And I wait for "Map" @@ -88,7 +88,7 @@ Feature: Recline Then I should see "Test R2" When I click "Edit" And I click "Remote file" - And I fill in "edit-field-link-remote-file-und-0-filefield-dkan-remotefile-url" with "http://s3.amazonaws.com/dkan-default-content-files/files/data_0.csv" + And I fill in "edit-field-link-remote-file-und-0-filefield-dkan-remotefile-url" with "https://s3.amazonaws.com/dkan-default-content-files/files/data_0.csv" And I press "edit-submit" Then I should see "data_0.csv" Then I wait for "3" seconds @@ -106,7 +106,7 @@ Feature: Recline Then I should see "Test R1" When I click "Edit" And I click "Remote file" - And I fill in "edit-field-link-remote-file-und-0-filefield-dkan-remotefile-url" with "http://s3.amazonaws.com/dkan-default-content-files/files/Polling_Places_Madison_0.csv" + And I fill in "edit-field-link-remote-file-und-0-filefield-dkan-remotefile-url" with "https://s3.amazonaws.com/dkan-default-content-files/files/Polling_Places_Madison_0.csv" And I press "edit-submit" And I wait for "Loading" to disappear And I wait for "1" seconds diff --git a/dkan/test/features/topics.feature b/dkan/test/features/topics.feature index 22178d145..693a8ee14 100644 --- a/dkan/test/features/topics.feature +++ b/dkan/test/features/topics.feature @@ -15,9 +15,9 @@ Feature: Topics | Add Topic | /admin/structure/taxonomy/dkan_topics/add | | Rebuild perms | /admin/reports/status/rebuild | - @api @javascript + @api @javascript @exceeds30seconds Scenario: Rebuild Permissions - Given I am logged in as a user with the "administrator" role + Given I am logged in as a user with the "administrator" role Given I am on the "Rebuild perms" page And I press "Rebuild permissions" And I wait for "Status report" @@ -52,4 +52,4 @@ Feature: Topics And I check the box "edit-field-topic-icon-und-xe909" And I press "Save" Then I should see "Created new term Abibliophobia." - + diff --git a/dkan/test/features/user.admin.feature b/dkan/test/features/user.admin.feature index 34f2c2000..787404b5f 100644 --- a/dkan/test/features/user.admin.feature +++ b/dkan/test/features/user.admin.feature @@ -12,9 +12,36 @@ Feature: User Given users: | name | mail | roles | | John | john@example.com | site manager | + | Badmin | admin@example.com | site manager | | aadmin | admin@example.com | administrator | + | Gabriel | gabriel@example.com | content creator | | Jaz | jaz@example.com | editor | | Katie | katie@example.com | content creator | + | Martin | martin@example.com | editor | + | Celeste | celeste@example.com | editor | + Given groups: + | title | author | published | + | Group 01 | Badmin | Yes | + | Group 02 | Badmin | Yes | + | Group 03 | Badmin | No | + And group memberships: + | user | group | role on group | membership status | + | Gabriel | Group 01 | administrator member | Active | + | Katie | Group 01 | member | Active | + | Jaz | Group 01 | member | Pending | + | Admin | Group 02 | administrator member | Active | + | Celeste | Group 02 | member | Active | + And "Tags" terms: + | name | + | world | + | results | + And datasets: + | title | publisher | author | published | tags | description | + | Dataset 01 | Group 01 | Katie | Yes | world | Test | + | Dataset 02 | Group 01 | Katie | No | world | Test | + | Dataset 03 | Group 01 | Gabriel | Yes | results | Test | + | Dataset 04 | Group 01 | Katie | Yes | world | Test | + Scenario: Edit any user account Given I am logged in as "John" diff --git a/dkan/test/features/user.all.feature b/dkan/test/features/user.all.feature index 31df4a524..a7f81143f 100644 --- a/dkan/test/features/user.all.feature +++ b/dkan/test/features/user.all.feature @@ -11,18 +11,32 @@ Feature: User Given users: | name | mail | roles | pass | | John | john@example.com | site manager | johnpass | + | Badmin | admin@example.com | site manager | pass | + | Gabriel | gabriel@example.com | content creator | pass | + | Jaz | jaz@example.com | editor | pass | | Katie | katie@example.com | content creator | pass | + | Martin | martin@example.com | editor | pass | + | Celeste | celeste@example.com | editor | pass | Given groups: | title | author | published | - | Group 01 | John | Yes | + | Group 01 | Badmin | Yes | + | Group 02 | Badmin | Yes | + | Group 03 | Badmin | No | And group memberships: | user | group | role on group | membership status | - | John | Group 01 | administrator member | Active | + | Gabriel | Group 01 | administrator member | Active | | Katie | Group 01 | member | Active | + | Jaz | Group 01 | member | Pending | + | Admin | Group 02 | administrator member | Active | + | Celeste | Group 02 | member | Active | + And "Tags" terms: + | name | + | world | + | results | And datasets: - | title | publisher | author | published | description | - | Dataset 01 | Group 01 | Katie | Yes | Test | - | Dataset 02 | Group 01 | Katie | Yes | Test | + | title | publisher | author | published | tags | description | + | Dataset 01 | Group 01 | Katie | Yes | world | Test | + | Dataset 02 | Group 01 | Katie | Yes | world | Test | @user_all_01 @login Scenario: Login diff --git a/dkan/test/features/user.site_manager.feature b/dkan/test/features/user.site_manager.feature index 5e7f9520b..a3e01f6b7 100644 --- a/dkan/test/features/user.site_manager.feature +++ b/dkan/test/features/user.site_manager.feature @@ -19,6 +19,7 @@ Feature: User command center links for site manager role. Then I hover over the admin menu item "Page" And I hover over the admin menu item "Data Story" And I hover over the admin menu item "Data Dashboard" + And I hover over the admin menu item "Harvest Source" #DKAN When I hover over the admin menu item "DKAN" Then I hover over the admin menu item "DKAN Dataset Forms" @@ -54,5 +55,6 @@ Feature: User command center links for site manager role. Scenario: Site manager role can configure custom fonts Given I am logged in as "John" When I hover over the admin menu item "Site Configuration" + Then I hover over the admin menu item "Appearance" And I click "Fonts" Then I should see "No fonts enabled yet, please enable some fonts first." diff --git a/dkan/test/features/workflow.feature b/dkan/test/features/workflow.feature index a445e167b..48ecdca6a 100644 --- a/dkan/test/features/workflow.feature +++ b/dkan/test/features/workflow.feature @@ -452,7 +452,7 @@ Feature: | Administrator | admin@fakeemail.com | 1 | administrator | And The "source_one" source is harvested And the content "Florida Bike Lanes Harvest" should be "published" - + @workflow_21 @ok @globalUser Scenario: As a Workflow Moderator, I should be able to see Stale Needs Review datasets I did not author, but which belongs to my Group, in 'Needs Review' Given users: @@ -468,7 +468,7 @@ Feature: Given I am logged in as "Moderator" And I am on "Stale Reviews" page Then I should see the text "Not My Dataset" - + @workflow_22 @api @javascript @globalUser Scenario: As a user I should be able to see my content back on "My Drafts" section if it was rejected # Submit a dataset to Needs Review @@ -496,7 +496,7 @@ Feature: When I am on the "My Drafts" page Then I should see "My Draft Dataset" - @workflow_23 @javascript + @workflow_23 @javascript @fixme Scenario: As an anonymous user I should see a revisions link when dkan_workflow is enabled. Given pages: | name | url | diff --git a/dkan/test/phpunit/dkan_dataset/ApiTest.php b/dkan/test/phpunit/dkan_dataset/ApiTest.php new file mode 100644 index 000000000..ae374083d --- /dev/null +++ b/dkan/test/phpunit/dkan_dataset/ApiTest.php @@ -0,0 +1,58 @@ +<?php + +/** + * @file + * ApiTest. + */ + +use DKAN\Client; + +/** + * Class ApiTest. + */ +class ApiTest extends \PHPUnit_Framework_TestCase { + + private $client; + + /** + * Constructor. + */ + public function __construct($name = NULL, array $data = [], $dataName = '') { + parent::__construct($name, $data, $dataName); + global $base_url; + $this->client = new Client("{$base_url}/api/dataset"); + $this->client->login('admin', 'admin'); + } + + /** + * Test required fields. + */ + public function testRequiredFields() { + try { + $this->client->nodeCreate((object) []); + } + catch (\Exception $e) { + $message = $e->getMessage(); + $this->assertContains("406", $message); + $this->assertContains("Node type is required", $message); + } + } + + /** + * Test options. + */ + public function testOptions() { + try { + $this->client->nodeCreate((object) [ + 'title' => 'PHPUNIT Test Dataset', + 'type' => 'dataset', + 'field_license' => ['und' => [0 => ['value' => "blah"]]] + ]); + } + catch (\Exception $e) { + $message = $e->getMessage(); + $this->assertContains("Invalid option for field field_license", $message); + } + } + +} diff --git a/dkan/test/phpunit/dkan_dataset/getRemoteFileInfoTest.php b/dkan/test/phpunit/dkan_dataset/getRemoteFileInfoTest.php index 74dfc0555..37cae6b8f 100644 --- a/dkan/test/phpunit/dkan_dataset/getRemoteFileInfoTest.php +++ b/dkan/test/phpunit/dkan_dataset/getRemoteFileInfoTest.php @@ -49,7 +49,7 @@ public function testUrls() { $urls[1]['url'] = "https://data.ca.gov/node/1801/download"; $urls[1]['type'] = 'text/csv'; $urls[1]['extension'] = 'csv'; - $urls[1]['name'] = "uw_supplier_data020618.csv"; + $urls[1]['name'] = "uw_supplier_data040318.csv"; $urls[2]['url'] = "https://s3.amazonaws.com/dkan-default-content-files/files/albo.xls"; $urls[2]['type'] = 'application/vnd.ms-excel'; diff --git a/dkan/test/phpunit/dkan_harvest/data/dkan_harvest_datajson_test_temporal.json b/dkan/test/phpunit/dkan_harvest/data/dkan_harvest_datajson_test_temporal.json index 31440ce4a..f5545083a 100644 --- a/dkan/test/phpunit/dkan_harvest/data/dkan_harvest_datajson_test_temporal.json +++ b/dkan/test/phpunit/dkan_harvest/data/dkan_harvest_datajson_test_temporal.json @@ -21,9 +21,9 @@ "distribution": [ { "@type": "dcat:Distribution", - "downloadURL": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AmbulanceFeeSchedule/afspuf.html", + "downloadURL": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AmbulanceFeeSchedule/afspuf.html", "mediaType": "text/html", - "accessURL": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AmbulanceFeeSchedule/afspuf.html" + "accessURL": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AmbulanceFeeSchedule/afspuf.html" } ], "identifier": "156", @@ -34,7 +34,7 @@ "State", "Claims" ], - "landingPage": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AmbulanceFeeSchedule/afspuf.html", + "landingPage": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AmbulanceFeeSchedule/afspuf.html", "modified": "2016-04-07", "programCode": [ "009:000" @@ -65,9 +65,9 @@ "distribution": [ { "@type": "dcat:Distribution", - "downloadURL": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/Readmissions-Reduction-Program.html", + "downloadURL": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/Readmissions-Reduction-Program.html", "mediaType": "text/html", - "accessURL": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/Readmissions-Reduction-Program.html" + "accessURL": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/Readmissions-Reduction-Program.html" } ], "identifier": "155", @@ -87,7 +87,7 @@ "Publically Available Data File - for download", "Chronic Condition" ], - "landingPage": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/Readmissions-Reduction-Program.html", + "landingPage": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/Readmissions-Reduction-Program.html", "modified": "2016-04-07", "programCode": [ "009:000" @@ -118,7 +118,7 @@ "distribution": [ { "@type": "dcat:Distribution", - "accessURL": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/dsh.html" + "accessURL": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/dsh.html" } ], "identifier": "154", @@ -141,7 +141,7 @@ "Part C", "Disproportionate Share Hospitals (DSH)" ], - "landingPage": "http://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/dsh.html", + "landingPage": "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/AcuteInpatientPPS/dsh.html", "modified": "2016-01-06", "programCode": [ "009:000" @@ -171,7 +171,7 @@ "distribution": [ { "@type": "dcat:Distribution", - "accessURL": "http://www.cms.gov/Research-Statistics-Data-and-Systems/Files-for-Order/NonIdentifiableDataFiles/UPINGroupFile.html" + "accessURL": "https://www.cms.gov/Research-Statistics-Data-and-Systems/Files-for-Order/NonIdentifiableDataFiles/UPINGroupFile.html" } ], "identifier": "241", @@ -181,7 +181,7 @@ "Providers", "State" ], - "landingPage": "http://www.cms.gov/Research-Statistics-Data-and-Systems/Files-for-Order/NonIdentifiableDataFiles/UPINGroupFile.html", + "landingPage": "https://www.cms.gov/Research-Statistics-Data-and-Systems/Files-for-Order/NonIdentifiableDataFiles/UPINGroupFile.html", "modified": "2015-12-16", "programCode": [ "009:000" diff --git a/dkan/test/phpunit/phpunit.xml b/dkan/test/phpunit/phpunit.xml index af6c07fa9..de1942010 100644 --- a/dkan/test/phpunit/phpunit.xml +++ b/dkan/test/phpunit/phpunit.xml @@ -25,6 +25,7 @@ <file>dkan_dataset/DataJsonTest.php</file> <file>dkan_dataset/getRemoteFileInfoTest.php</file> <file>dkan_dataset/reclineEmbedCacheTest.php</file> + <file>dkan_dataset/ApiTest.php</file> </testsuite> <testsuite name="DKAN Datastore Test Suite"> <file>dkan_datastore/DkanDatastoreTest.php</file> diff --git a/dkan/themes/nuboot_radix/README.md b/dkan/themes/nuboot_radix/README.md index b48280635..56900c59f 100644 --- a/dkan/themes/nuboot_radix/README.md +++ b/dkan/themes/nuboot_radix/README.md @@ -5,7 +5,7 @@ This is the default theme for DKAN 1.0 -> https://github.com/GetDKAN/dkan ## Installation -Your theme will use [Gulp](http://gulpjs.com) to compile Sass. Gulp needs Node. +Your theme will use [Gulp](https://gulpjs.com/) to compile Sass. Gulp needs Node. #### Step 1 Make sure you have Node and npm installed. @@ -50,13 +50,13 @@ OR if using Ahoy: ```ahoy dkan theme watch``` -The new subtheme will be placed in to the /sites/all/themes/ directory, it will contain the proper directory structure to get you started. +The new subtheme will be placed in to the /sites/all/themes/ directory, it will contain the proper directory structure to get you started. ## Updating subthemes that were based on Radix 7.x-rc4 To upgrade an older NuBoot Radix subtheme to use the new Radix 7.x-3.3 compiling process, it will need to be done manually, follow the steps outlined here: -http://www.radixtheme.org/articles/update-rc4-to-3/ +https://www.radixtheme.org/articles/update-rc4-to-3/ ## Use @@ -67,8 +67,8 @@ Use the components directory to break out your styles into easy to find partial ## Credits for icon assets used in this project -**Streamline Icons** http://www.streamlineicons.com/index.html +**Streamline Icons** https://www.streamlineicons.com/index.html -**Flaticons** designed by Freepik http://www.flaticon.com/packs/file-formats-icons +**Flaticons** designed by Freepik https://www.flaticon.com/packs/file-formats-icons -**Font Awesome** http://fontawesome.io/ +**Font Awesome** https://fontawesome.com/ diff --git a/dkan/themes/nuboot_radix/includes/node.inc b/dkan/themes/nuboot_radix/includes/node.inc index fa8d455d3..f159f6036 100644 --- a/dkan/themes/nuboot_radix/includes/node.inc +++ b/dkan/themes/nuboot_radix/includes/node.inc @@ -21,7 +21,8 @@ function nuboot_radix_preprocess_node(&$variables) { $variables['dataset_list'] = ''; $variables['group_list'] = NULL; - $variables['body'] = empty($wrapper->body->value()) ? '' : $wrapper->body->value->value(); + $body = $wrapper->body->value(); + $variables['body'] = empty($body) ? '' : $body; $path = drupal_lookup_path('alias', "node/" . $wrapper->getIdentifier()); $variables['node_url'] = $path ? $path : "node/{$variables['nid']}"; if ($variables['type'] == 'resource' && $wrapper->field_dataset_ref->count() > 0) { @@ -32,7 +33,7 @@ function nuboot_radix_preprocess_node(&$variables) { $groups = og_get_entity_groups('node', $wrapper->value()); if (!empty($groups['node'])) { - $groups = array_map(function($gid) { + $groups = array_map(function ($gid) { $g_wrapper = entity_metadata_wrapper('node', $gid); return $g_wrapper->label(); }, array_values($groups['node'])); diff --git a/dkan/themes/nuboot_radix/template.php b/dkan/themes/nuboot_radix/template.php index 2b83a803c..c81280d7c 100644 --- a/dkan/themes/nuboot_radix/template.php +++ b/dkan/themes/nuboot_radix/template.php @@ -73,7 +73,7 @@ function nuboot_radix_breadcrumb($variables) { */ function nuboot_radix_facetapi_link_inactive($variables) { // Builds accessible markup. - // @see http://drupal.org/node/1316580 + // @see https://drupal.org/node/1316580 $accessible_vars = array( 'text' => $variables['text'], 'active' => FALSE, @@ -113,7 +113,7 @@ function nuboot_radix_facetapi_link_active($variables) { $link_text = ($sanitize) ? check_plain($variables['text']) : $variables['text']; // Theme function variables fro accessible markup. - // @see http://drupal.org/node/1316580 + // @see https://drupal.org/node/1316580 $accessible_vars = array( 'text' => $variables['text'], 'active' => TRUE, diff --git a/dkan/themes/nuboot_radix/templates/node/node--search-result.tpl.php b/dkan/themes/nuboot_radix/templates/node/node--search-result.tpl.php index 479fd81ee..e73b5193f 100644 --- a/dkan/themes/nuboot_radix/templates/node/node--search-result.tpl.php +++ b/dkan/themes/nuboot_radix/templates/node/node--search-result.tpl.php @@ -5,7 +5,7 @@ * Template file for node search results. */ ?> -<article class="node-search-result row" xmlns="http://www.w3.org/1999/html"> +<article class="node-search-result row" xmlns="https://www.w3.org/1999/html"> <div class="col-md-2 col-lg-1 col-xs-2 icon-container"> <?php print drupal_render($result_icon) diff --git a/dkan/themes/nuboot_radix/templates/system/html.tpl.php b/dkan/themes/nuboot_radix/templates/system/html.tpl.php index 8805cc60e..a288026a4 100644 --- a/dkan/themes/nuboot_radix/templates/system/html.tpl.php +++ b/dkan/themes/nuboot_radix/templates/system/html.tpl.php @@ -6,7 +6,7 @@ */ ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" - "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> + "https://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> <html lang="<?php print $language->language; ?>" dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces;?>> <head profile="<?php print $grddl_profile; ?>"> <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"> diff --git a/dkan/themes/nuboot_radix/theme-settings.php b/dkan/themes/nuboot_radix/theme-settings.php index cb423793f..b71731bb1 100644 --- a/dkan/themes/nuboot_radix/theme-settings.php +++ b/dkan/themes/nuboot_radix/theme-settings.php @@ -24,7 +24,7 @@ function nuboot_radix_form_system_theme_settings_alter(&$form, &$form_state) { '#title' => t('Footer text'), '#type' => 'text_format', '#format' => 'html', - '#default_value' => isset($copyright['value']) ? $copyright['value'] : t('Powered by <a href="http://getdkan.org/">DKAN</a>'), + '#default_value' => isset($copyright['value']) ? $copyright['value'] : t('Powered by <a href="https://getdkan.org/">DKAN</a>'), ); $display_login_menu = (theme_get_setting('display_login_menu', 'nuboot_radix') === NULL) ? 1 : theme_get_setting('display_login_menu', 'nuboot_radix'); diff --git a/docroot/CHANGELOG.txt b/docroot/CHANGELOG.txt new file mode 100644 index 000000000..0929559d1 --- /dev/null +++ b/docroot/CHANGELOG.txt @@ -0,0 +1,2316 @@ + +Drupal 7.59, 2018-04-25 +----------------------- +- Fixed security issues (remote code execution). See SA-CORE-2018-004. + +Drupal 7.58, 2018-03-28 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2018-002. + +Drupal 7.57, 2018-02-21 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2018-001. + +Drupal 7.56, 2017-06-21 +----------------------- +- Fixed security issues (access bypass). See SA-CORE-2017-003. + +Drupal 7.55, 2017-06-07 +----------------------- +- Fixed incompatibility with PHP versions 7.0.19 and 7.1.5 due to duplicate + DATE_RFC7231 definition. +- Made Drupal core pass all automated tests on PHP 7.1. +- Allowed services such as Let's Encrypt to work with Drupal on Apache, by + making Drupal's .htaccess file allow access to the .well-known directory + defined by RFC 5785. +- Made new Drupal sites work correctly on Apache 2.4 when the mod_access_compat + Apache module is disabled. +- Fixed Drupal's URL-generating functions to always encode '[' and ']' so that + the URLs will pass HTML5 validation. +- Various additional bug fixes. +- Various API documentation improvements. +- Additional automated test coverage. + +Drupal 7.54, 2017-02-01 +----------------------- +- Modules are now able to define theme engines (API addition: + https://www.drupal.org/node/2826480). +- Logging of searches can now be disabled (new option in the administrative + interface). +- Added menu tree render structure to (pre-)process hooks for theme_menu_tree() + (API addition: https://www.drupal.org/node/2827134). +- Added new function for determining whether an HTTPS request is being served + (API addition: https://www.drupal.org/node/2824590). +- Fixed incorrect default value for short and medium date formats on the date + type configuration page. +- File validation error message is now removed after subsequent upload of valid + file. +- Numerous bug fixes. +- Numerous API documentation improvements. +- Additional performance improvements. +- Additional automated test coverage. + +Drupal 7.53, 2016-12-07 +----------------------- +- Fixed drag and drop support on newer Chrome/IE 11+ versions after 7.51 update + when jQuery is updated to 1.7-1.11.0. + +Drupal 7.52, 2016-11-16 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2016-005. + +Drupal 7.51, 2016-10-05 +----------------------- +- The Update module now also checks for updates to a disabled theme that is + used as an admin theme. +- Exceptions thrown in dblog_watchdog() are now caught and ignored. +- Clarified the warning that appears when modules are missing or have moved. +- Log messages are now XSS filtered on display. +- Draggable tables now work on touch screen devices. +- Added a setting for allowing double underscores in CSS identifiers + (https://www.drupal.org/node/2810369). +- If a user navigates away from a page while an Ajax request is running they + will no longer get an error message saying "An Ajax HTTP request terminated + abnormally". +- The system_region_list() API function now takes an optional third parameter + which allows region name translations to be skipped when they are not needed + (API addition: https://www.drupal.org/node/2810365). +- Numerous performance improvements. +- Numerous bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.50, 2016-07-07 +----------------------- +- Added a new "administer fields" permission for trusted users, which is + required in addition to other permissions to use the field UI + (https://www.drupal.org/node/2483307). +- Added clickjacking protection to Drupal core by setting the X-Frame-Options + header to SAMEORIGIN by default (https://www.drupal.org/node/2735873). +- Added support for full UTF-8 (emojis, Asian symbols, mathematical symbols) on + MySQL and other database drivers when the site and database are configured to + allow it (https://www.drupal.org/node/2761183). +- Improved performance by avoiding a re-scan of directories when a file is + missing; instead, trigger a PHP warning (minor API change: + https://www.drupal.org/node/2581445). +- Made it possible to use any PHP callable in Ajax form callbacks, form API + form-building functions, and form API wrapper callbacks (API addition: + https://www.drupal.org/node/2761169). +- Fixed that following a password reset link while logged in leaves users unable + to change their password (minor user interface change: + https://www.drupal.org/node/2759023). +- Implemented various fixes for automated test failures on PHP 5.4+ and PHP 7. + Drupal core automated tests now pass in these environments. +- Improved support for PHP 7 by fixing various problems. +- Fixed various bugs with PHP 5.5+ imagerotate(), including when incorrect + color indices are passed in. +- Fixed a regression introduced in Drupal 7.43 that allowed files uploaded by + anonymous users to be lost after form validation errors, and that also caused + regressions with certain contributed modules. +- Fixed a regression introduced in Drupal 7.36 which caused the default value + of hidden textarea fields to be ignored. +- Fixed robots.txt to allow search engines to access CSS, JavaScript and image + files. +- Changed wording on the Update Manager settings page to clarify that the + option to check for disabled module updates also applies to uninstalled + modules (administrative-facing translatable string change). +- Changed the help text when editing menu links and configuring URL redirect + actions so that it does not reference "Drupal" or the drupal.org website + (administrative-facing translatable string change). +- Fixed the locale safety check that is used to ensure that translations are + safe to allow for tokens in the href/src attributes of translated strings. +- Fixed that URL generation only works on port 80 when using domain based + language negotation. +- Made method="get" forms work inside the administrative overlay. The fix adds + a new hidden field to these forms when they appear inside the overlay (minor + data structure change). +- Increased maxlength of menu link title input fields in the node form and + menu link form from 128 to 255 characters. +- Removed meaningless post-check=0 and pre-check=0 cache control headers from + Drupal HTTP responses. +- Added a .editorconfig file to auto-configure editors that support it. +- Added --directory option to run-tests.sh for easier test discovery of all + tests within a project. +- Made run-tests.sh exit with a failure code when there are test fails or + problems running the script. +- Fixed that cookies from previous tests are still present when a new test + starts in DrupalWebTestCase. +- Improved performance of queries on the {authmap} database table. +- Fixed handling of missing files and functions inside the registry. +- Fixed Ajax handling for tableselect form elements that use checkboxes. +- Fixed a bug which caused ip_address() to return nothing when the client IP + address and proxy IP address are the same. +- Added a new option to format_xml_elements() to allow for already encoded + values. +- Changed the {history} table's node ID field to be an unsigned integer, to + match the same field in the {node} table and to prevent errors with very + large node IDs. +- Added an explicit page callback to the "admin/people/create" menu item in the + User module (minor data structure change). Previously this automatically + inherited the page callback from the parent "admin/people" menu item, which + broke contributed modules that override the "admin/people" page. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.44, 2016-06-15 +----------------------- +- Fixed security issues (privilege escalation). See SA-CORE-2016-002. + +Drupal 7.43, 2016-02-24 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2016-001. + +Drupal 7.42, 2016-02-03 +----------------------- +- Stopped invoking hook_flush_caches() on every cron run, since some modules + use that hook for expensive operations that are only needed on cache clears. +- Changed the default .htaccess and web.config to block Composer-related files. +- Added static caching to module_load_include() to improve performance. +- Fixed double-encoding bugs in select field widgets provided by the Options + module. The fix deprecates the 'strip_tags' property on option widgets and + replaces it with a new 'strip_tags_and_unescape' property (minor data + structure change). +- Improved MySQL 5.7 support by changing the MySQL database driver to stop + using the ANSI SQL mode alias, which has different meanings for different + MySQL versions. +- Fixed a regression introduced in Drupal 7.39 which prevented autocomplete + functionality from working on servers that are not configured to + automatically recognize index.php. +- Updated the Archive_Tar PEAR package to the latest 1.4.0 release, to fix bugs + with tar file handling on various operating systems. +- Fixed fatal errors on node preview when a field is displayed in the node + teaser but hidden in the full node view. The fix removes a + field_attach_prepare_view() call from the node_preview() function since it is + redundant with one in the node preview theme layer. +- Improved the description of the "Trimmed" format option on text fields + (translatable string change, and minor UI and data structure change). +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.41, 2015-10-21 +----------------------- +- Fixed security issues (open redirect). See SA-CORE-2015-004. + +Drupal 7.40, 2015-10-14 +----------------------- +- Made Drupal's code for parsing .info files run much faster and use much less + memory. +- Prevented drupal_http_request() from returning an error when it receives a + 201 through 206 HTTP status code. +- Added support for autoloading traits via the registry on sites running PHP + 5.4 or higher. +- Allowed the user-picture.tpl.php theme template to have HTML classes besides + the default "user-picture" class printed in it (markup change). +- Fixed the URL text filter to convert e-mail addresses with plus signs into + mailto: links. +- Added alternate text to file icons displayed by the File module, to improve + accessibility (string change, and minor API addition to theme_file_icon()). +- Changed one-time login link failure messages to be displayed as errors or + warnings as appropriate, rather than as regular status messages (minor UI + change and data structure change). +- Changed the default settings.php configuration to exclude private files from + the "404_fast_paths" behavior. +- Changed the page that displays filter tips for a particular text format, for + example filter/tips/full_html, to return "page not found" or "access denied" + if the format does not exist or the user does not have access to it. This + change adds a new menu item to the Filter module's hook_menu() entry (minor + data structure change). +- Added a new hook, hook_block_cid_parts_alter(), to allow modules to alter the + cache keys used for caching a particular block. +- Made drupal_set_message() display and return messages when "0" is passed in + as the message to set. +- Fixed non-functional "Files displayed by default" setting on file fields. +- The "worker callback" provided in hook_cron_queue_info() and the "finished" + callback specified during batch processing can now be any PHP callable + instead of just functions. +- Prevented drupal_set_time_limit() from decreasing the time limit in the case + where the PHP maximum execution time is already unlimited. +- Changed the default thousand marker for numeric fields from a space ("1 000") + to nothing ("1000") (minor UI change: https://www.drupal.org/node/1388376). +- Prevented malformed theme .info files (without a "name" key) from causing + exceptions during menu rebuilds. If an .info file without a "name" key is + found in a module or theme directory, Drupal will now use the module or + theme's machine name as the display name instead. +- Made the format column in the {date_format_locale} database table + case-sensitive, to match the equivalent column in the {date_formats} table. +- Fixed a bug in the Statistics module that caused JavaScript files attached to + a node while it is being viewed to be omitted from the page. +- Added an optional 'project:' prefix that can be added to dependencies in a + module's .info file to indicate which project the dependency resides in (API + addition: https://www.drupal.org/node/2299747). +- Fixed various bugs that occurred after hooks were invoked early in the Drupal + bootstrap and that caused module_implements() and drupal_alter() to cache an + incomplete set of hook implementations for later use. +- Set the X-Content-Type-Options header to "nosniff" when possible, to prevent + certain web browsers from picking an unsafe MIME type. +- Prevented the database API from executing multiple queries at once on MySQL, + if the site's PHP version is new enough to do so. This is a secondary defense + against SQL injection (API change: https://www.drupal.org/node/2463973). +- Fixed a bug in the Drupal 6 to Drupal 7 upgrade path which caused the upgrade + to fail when there were multiple file records pointing to the same file. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.39, 2015-08-19 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2015-003. + +Drupal 7.38, 2015-06-17 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2015-002. + +Drupal 7.37, 2015-05-07 +----------------------- +- Fixed a regression in Drupal 7.36 which caused certain kinds of content types + to become disabled if they were defined by a no-longer-enabled module. +- Removed a confusing description regarding automatic time zone detection from + the user account form (minor UI and data structure change). +- Allowed custom HTML tags with a dash in the name to pass through filter_xss() + when specified in the list of allowed tags. +- Allowed hook_field_schema() implementations to specify indexes for fields + based on a fixed-length column prefix (rather than the entire column), as was + already allowed in hook_schema() implementations. +- Fixed PDO exceptions on PostgreSQL when accessing invalid entity URLs. +- Added a sites/all/libraries folder to the codebase, with instructions for + using it. +- Added a description to the "Administer text formats and filters" permission + on the Permissions page (string change). +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.36, 2015-04-01 +----------------------- +- Added a 'file_public_schema' variable which allows modules that define + publicly-accessible streams in hook_stream_wrappers() to bypass file download + access checks when processing managed file upload fields. +- Fixed a bug that caused database query tags not to be added to search-related + database queries under many circumstances, and which prevented the + corresponding hook_query_TAG_alter() implementations from being called. +- Fixed the "for" attribute on managed file upload field labels to improve + accessibility (minor markup change). +- Added a 'javascript_always_use_jquery' variable which can be set to FALSE by + sites that may not need jQuery loaded on all pages, and a 'requires_jquery' + option to drupal_add_js() which modules can set to FALSE when adding + JavaScript files that have no dependency on jQuery (API addition: + https://www.drupal.org/node/2462717). +- Fixed incorrect foreign keys in the User module's role_permission and + users_roles database tables. +- Changed permission descriptions throughout Drupal core to consistently link + to relevant administrative pages, regardless of whether the user viewing the + Permissions page can view the page being linked to (minor UI change). +- Fixed the drupal_add_region_content() function so that it actually adds + content to the page. +- Added an 'image_suppress_itok_output' variable to allow sites already using + the existing 'image_allow_insecure_derivatives' variable to also prevent + security tokens from appearing in image derivative URLs. +- Fixed double-escaping of theme names in the Block module administrative + interface (minor string change). +- Added basic support for Xdebug when running automated tests. +- Fixed a bug which caused previewing a node to remove elements from the node + being edited. With this fix, calling node_preview() will no longer modify the + passed-in node object (minor API change). +- Added a user_has_role() function to check whether a user has a particular + role (API addition: https://www.drupal.org/node/2462411). +- Fixed installation failures when an opcode cache is enabled. +- Fixed a bug in the Drupal 6 to Drupal 7 upgrade path which caused private + files to be inaccessible. +- Fixed a bug in the Drupal 6 to Drupal 7 upgrade path which caused user + pictures to be lost. +- Fixed missing language code in hook_field_attach_view_alter() when it is + invoked from field_view_field(). +- Stopped sending ETag and Last-Modified headers for uncached page requests, + since they break caching for certain Varnish and Nginx configurations. +- Changed the Simpletest module to allow PSR-4 test classes to be used in + Drupal 7. +- Fixed a fatal error that occurred when using the Comment module's "Unpublish + comment containing keyword(s)" action. +- Changed the "lang" attribute on language links to "xml:lang" so it validates + as XHTML (minor markup change). +- Prevented the form API from allowing arrays to be submitted for various form + elements, such as textfields, textareas, and password fields (API change: + https://www.drupal.org/node/2462723). +- Fixed a bug in the Contact module which caused the global user object to have + the incorrect name and e-mail address during the remainder of the page + request after the contact form is submitted. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.35, 2015-03-18 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2015-001. + +Drupal 7.34, 2014-11-19 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2014-006. + +Drupal 7.33, 2014-11-07 +----------------------- +- Began storing the file modification time of each module and theme in the + {system} database table so that contributed modules can use it to identify + recently changed modules and themes (minor data structure change to the + return value of system_get_info() and other related functions). +- Added a "Did you mean?" feature to the run-tests.sh script for running + automated tests from the command line, to help developers who are attempting + to run a particular test class or group. +- Changed the date format used in various HTTP headers output by Drupal core + from RFC 1123 format to RFC 7231 format. +- Added a "block_cache_bypass_node_grants" variable to allow sites which have + node access modules enabled to use the block cache if desired (API addition). +- Made image derivative generation HTTP requests return a 404 error (rather + than a 500 error) when the source image does not exist. +- Fixed a bug which caused user pictures to be removed from the user object + after saving, and resulted in data loss if the user account was subsequently + re-saved. +- Fixed a bug in which field_has_data() did not return TRUE for fields that + only had data in older entity revisions, leading to loss of the field's data + when the field configuration was edited. +- Fixed a bug which caused the Ajax progress throbber to appear misaligned in + many situatons (minor styling change). +- Prevented the Bartik theme from lower-casing the "Permalink" link on + comments, for improved multilingual support (minor UI change). +- Added a "preferred_menu_links" tag to the database query that is used by + menu_link_get_preferred() to find the preferred menu link for a given path, + to make it easier to alter. +- Increased the maximum allowed length of block titles to 255 characters + (database schema change to the {block} table). +- Removed the Field module's field_modules_uninstalled() function, since it did + not do anything when it was invoked. +- Added a "theme_hook_original" variable to templates and theme functions and + an optional sitewide theme debug mode, to provide contextual information in + the page's HTML to theme developers. The theme debug mode is based on the one + used with Twig in Drupal 8 and can be accessed by setting the "theme_debug" + variable to TRUE (API addition). +- Added an entity_view_mode_prepare() API function to allow entity-defining + modules to properly invoke hook_entity_view_mode_alter(), and used it + throughout Drupal core to fix bugs with the invocation of that hook (API + change: https://www.drupal.org/node/2369141). +- Security improvement: Made the database API's orderBy() method sanitize the + sort direction ("ASC" or "DESC") for queries built with db_select(), so that + calling code does not have to. +- Changed the RDF module to consistently output RDF metadata for nodes and + comments near where the node is rendered in the HTML (minor markup and data + structure change). +- Added an HTML class to RDFa metatags throughout Drupal to prevent them from + accidentally affecting the site appearance (minor markup change). +- Fixed a bug in the Unicode requirements check which prevented installing + Drupal on PHP 5.6. +- Fixed a bug which caused drupal_get_bootstrap_phase() to abort the bootstrap + when called early in the page request. +- Renamed the "Search result" view mode to "Search result highlighting input" + to better reflect how it is used (UI change). +- Improved database queries generated by EntityFieldQuery in the case where + delta or language condition groups are used, to reduce the number of INNER + JOINs (this is a minor data structure change affecting code which implements + hook_query_alter() on these queries). +- Removed special-case behavior for file uploads which allowed user #1 to + bypass maximum file size and user quota limits. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.32, 2014-10-15 +----------------------- +- Fixed security issues (SQL injection). See SA-CORE-2014-005. + +Drupal 7.31, 2014-08-06 +----------------------- +- Fixed security issues (denial of service). See SA-CORE-2014-004. + +Drupal 7.30, 2014-07-24 +----------------------- +- Fixed a regression introduced in Drupal 7.29 that caused files or images + attached to taxonomy terms to be deleted when the taxonomy term was edited + and resaved (and other related bugs with contributed and custom modules). +- Added a warning on the permissions page to recommend restricting access to + the "View site reports" permission to trusted administrators. See + DRUPAL-PSA-2014-002. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.29, 2014-07-16 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2014-003. + +Drupal 7.28, 2014-05-08 +----------------------- +- Fixed a regression introduced in Drupal 7.27 that caused JavaScript to break + on older browsers (such as Internet Explorer 8 and earlier) when Ajax was + used. +- Increased the timeout used by the Update Manager module when it fetches data + from drupal.org (from 5 seconds to 30 seconds), to work around a problem + which causes incomplete information about security updates to be presented to + site administrators. This fix may lead to a performance slowdown on the + Update Manager administration pages, when installing Drupal distributions, + and (for sites that use the automated cron feature) on occasional page loads + by site visitors. +- Fixed the behavior of the token system's "[node:summary]" token when the body + field does not have a manual summary. +- Changed the behavior of db_query_temporary() so that it works on SELECT + queries even when they have leading comments/whitespace. A side effect of + this fix is that db_query_temporary() will now fail with an error if it is + ever used on non-SELECT queries. +- Added a "node_admin_filter" tag to the database query used to build the list + of nodes on the content administration page, to make it easier to alter. +- Made the cron queue system log any exceptions that are thrown while an item + in the queue is being processed, rather than stopping the entire PHP request. +- Improved screen reader support by adding an aria-live HTML attribute to file + upload fields when there is an error uploading the file (minor markup + change). +- Made the pager on the Tracker module listing pages show the same number of + items as other pagers throughout Drupal core (minor UI change). +- Fixed a bug which caused caches not to be properly cleared when a file entity + was saved or deleted. +- Added several missing countries to the default list returned by + country_get_list() (string change). +- Replaced the term "weight" with "influence" in the content ranking settings + for search, and added help text for administrators (string change). +- Fixed untranslatable text strings in the administrative interface for the + "Crop" effect provided by the Image module (minor string change). +- Fixed a bug in the Taxonomy module update function introduced in Drupal 7.26 + that caused memory and CPU problems on sites with very large numbers of + unpublished nodes. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.27, 2014-04-16 +----------------------- +- Fixed security issues (information disclosure). See SA-CORE-2014-002. + +Drupal 7.26, 2014-01-15 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2014-001. + +Drupal 7.25, 2014-01-02 +----------------------- +- Fixed a bug in node_save() which prevented the saved node from being updated + in hook_node_insert() and other similar hooks. +- Added a meta tag to install.php to prevent it from being indexed by search + engines even when Drupal is installed in a subfolder (minor markup change). +- Fixed a bug in the database API that caused frequent deadlock errors when + running merge queries on some servers. +- Performance improvement: Prevented block rehashing from writing blocks to the + database on every cache clear and cron run when the blocks have not changed. + This fix results in an extra 'saved' key which is added and set to TRUE for + each block returned by _block_rehash() that actually is saved to the database + (data structure change). +- Added an optional 'skip on cron' parameter to hook_cron_queue_info() to allow + queues to avoid being automatically processed on cron runs (API addition). +- Fixed a bug which caused hook_block_view_MODULE_DELTA_alter() to never be + invoked if the block delta had a hyphen in it. To implement the hook when the + block delta has a hyphen, modules should now replace hyphens with underscores + when constructing the function name for the hook implementation. +- Fixed a bug which caused cached pages to sometimes be sent to the browser + with incorrect compression. The fix adds a new 'page_compressed' key to the + $cache->data array returned by drupal_page_get_cache() (minor data structure + change). +- Fixed broken tests on PHP 5.5. +- Made the File and Image modules more robust when saving entities that have + deleted files attached. The code in file_field_presave() will now remove the + record of the deleted file from the entity before saving (minor data + structure change). +- Standardized menu callback functions throughout Drupal core to return + MENU_NOT_FOUND and MENU_ACCESS_DENIED rather than printing their own "page + not found" or "access denied" pages (minor API change in the return value of + these functions under some circumstances). +- Fixed a bug in which caches were not properly cleared when a node was deleted + via the administrative interface. +- Changed the Bartik theme to render content contained in <pre>, <code> and + similar tags in a larger font size, so it is easier to read. +- Fixed a bug in the Search module that caused exceptions to be thrown during + searches if the server was not configured to represent decimal points as a + period. +- Fixed a regression in the Image module that made image_style_url() not work + when a relative path (rather than a complete file URI) was passed to it. +- Added an optional feature to the Statistics module to allow node views to be + tracked by Ajax requests rather than during the server-side generation of the + page. This allows the node counter to work on sites that use external page + caches (string change and new administrative option: + https://drupal.org/node/2164069). +- Added a link to the drupal.org documentation page for cron to the Cron + settings page (string change). +- Added a 'drupal_anonymous_user_object' variable to allow the anonymous user + object returned by drupal_anonymous_user() to be overridden with a classed + object (API addition). +- Changed the database API to allow inserts based on a SELECT * query to work + correctly. +- Changed the database schema of the {file_managed} table to allow Drupal to + manage files larger than 4 GB. +- Changed the File module's hook_field_load() implementation to prevent file + entity properties which have the same name as file or image field properties + from overwriting the field properties (minor API change). +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.24, 2013-11-20 +----------------------- +- Fixed security issues (multiple vulnerabilities), see SA-CORE-2013-003. + +Drupal 7.23, 2013-08-07 +----------------------- +- Fixed a fatal error on PostgreSQL databases when updating the Taxonomy module + from Drupal 6 to Drupal 7. +- Fixed the default ordering of CSS files for sites using right-to-left + languages, to consistently place the right-to-left override file immediately + after the CSS it is overriding (API change: https://drupal.org/node/2058463). +- Added a drupal_check_memory_limit() API function to allow the memory limit to + be checked consistently (API addition). +- Changed the default web.config file for IIS servers to allow favicon.ico + files which are present in the filesystem to be accessed. +- Fixed inconsistent support for the 'tel' protocol in Drupal's URL filtering + functions. +- Performance improvement: Allowed all hooks to be included in the + module_implements() cache, even those that are only invoked on HTTP POST + requests. +- Made the database system replace truncate queries with delete queries when + inside a transaction, to fix issues with PostgreSQL and other databases. +- Fixed a bug which caused nested contextual links to display improperly. +- Fixed a bug which prevented cached image derivatives from being flushed for + private files and other non-default file schemes. +- Fixed drupal_render() to always return an empty string when there is no + output, rather than sometimes returning NULL (minor API change). +- Added protection to cache_clear_all() to ensure that non-cache tables cannot + be truncated (API addition: a new isValidBin() method has been added to the + default database cache implementation). +- Changed the default .htaccess file to support HTTP authorization in CGI + environments. +- Changed the password reset form to pre-fill the username when requested via a + URL query parameter, and used this in the error message that appears after a + failed login attempt (minor data structure and behavior change). +- Fixed broken support for foreign keys in the field API. +- Fixed "No active batch" error when a user cancels their own account. +- Added a description to the "access content overview" permission on the + permissions page (string change). +- Added a drupal_array_diff_assoc_recursive() function to allow associative + arrays to be compared recursively (API addition). +- Added human-readable labels to image styles, in addition to the existing + machine-readable name (API change: https://drupal.org/node/2058503). +- Moved the drupal_get_hash_salt() function to bootstrap.inc and used it in + additional places in the code, for added security in the case where there is + no hash salt in settings.php. +- Fixed a regression in Drupal 7.22 that caused internal server errors for + sites running on very old Apache 1.x web servers. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.22, 2013-04-03 +----------------------- +- Allowed the drupal_http_request() function to be overridden so that + additional HTTP request capabilities can be added by contributed modules. +- Changed the Simpletest module to allow PSR-0 test classes to be used in + Drupal 7. +- Removed an unnecessary "Content-Disposition" header from private file + downloads; it prevented many private files from being viewed inline in a web + browser. +- Changed various field API functions to allow them to optionally act on a + single field within an entity (API addition: http://drupal.org/node/1825844). +- Fixed a bug which prevented Drupal's file transfer functionality from working + on some PHP 5.4 systems. +- Fixed incorrect log message when theme() is called for a theme hook that does + not exist (minor string change). +- Fixed Drupal's token-replacement system to allow spaces in the token value. +- Changed the default behavior after a user creates a node they do not have + access to view. The user will now be redirected to the front page rather than + an access denied page. +- Fixed a bug which prevented empty HTTP headers (such as "0") from being set. + (Minor behavior change: Callers of drupal_add_http_header() must now set + FALSE explicitly to prevent a header from being sent at all; this was already + indicated in the function's documentation.) +- Fixed OpenID errors when more than one module implements hook_openid(). The + behavior is now changed so that if more than one module tries to set the same + parameter, the last module's change takes effect. +- Fixed a serious documentation bug: The $name variable in the + taxonomy-term.tpl.php theme template was incorrectly documented as being + sanitized when in fact it is not. +- Fixed a bug which prevented Drupal 6 to Drupal 7 upgrades on sites which had + duplicate permission names in the User module's database tables. +- Added an empty "datatype" attribute to taxonomy term and username links to + make the RDFa markup upward compatible with RDFa 1.1 (minor markup addition). +- Fixed a bug which caused the denial-of-service protection added in Drupal + 7.20 to break certain valid image URLs that had an extra slash in them. +- Fixed a bug with update queries in the SQLite database driver that prevented + Drupal from being installed with SQLite on PHP 5.4. +- Fixed enforced dependencies errors updating to recent versions of Drupal 7 on + certain non-MySQL databases. +- Refactored the Field module's caching behavior to obtain large improvements + in memory usage for sites with many fields and instances (API addition: + http://drupal.org/node/1915646). +- Fixed entity argument not being passed to implementations of + hook_file_download_access_alter(). The fix adds an additional context + parameter that can be passed when calling drupal_alter() for any hook (API + change: http://drupal.org/node/1882722). +- Fixed broken support for translatable comment fields (API change: + http://drupal.org/node/1874724). +- Added an assertThemeOutput() method to Simpletest to allow tests to check + that themed output matches an expected HTML string (API addition). +- Added a link to "Install another module" after a module has been successfully + downloaded via the Update Manager (UI change). +- Added an optional "exclusive" flag to installation profile .info files which + allows Drupal distributions to force a profile to be selected during + installation (API addition: http://drupal.org/node/1961012). +- Fixed a bug which caused the database API to not properly close database + connections. +- Added a link to the URL for running cron from outside the site to the Cron + settings page (UI change). +- Fixed a bug which prevented image styles from being reverted on PHP 5.4. +- Made the default .htaccess rules protocol sensitive to improve security for + sites which use HTTPS and redirect between "www" and non-"www" versions of + the page. +- Numerous small bug fixes. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.21, 2013-03-06 +----------------------- +- Allowed sites using the 'image_allow_insecure_derivatives' variable to still + have partial protection from the security issues fixed in Drupal 7.20. + +Drupal 7.20, 2013-02-20 +----------------------- +- Fixed security issues (denial of service). See SA-CORE-2013-002. + +Drupal 7.19, 2013-01-16 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2013-001. + +Drupal 7.18, 2012-12-19 +----------------------- +- Fixed security issues (multiple vulnerabilities). See SA-CORE-2012-004. + +Drupal 7.17, 2012-11-07 +----------------------- +- Changed the default value of the '404_fast_html' variable to have a DOCTYPE + declaration. +- Made it possible to use associative arrays for the 'items' variable in + theme_item_list(). +- Fixed a bug which prevented required form elements without a title from being + given an "error" class when the form fails validation. +- Prevented duplicate HTML IDs from appearing when two forms are displayed on + the same page and one of them is submitted with invalid data (minor markup + change). +- Fixed a bug which prevented Drupal 6 to Drupal 7 upgrades on sites which had + stale data in the Upload module's database tables. +- Fixed a bug in the States API which prevented certain types of form elements + from being disabled when requested. +- Allowed aggregator feed items with author names longer than 255 characters to + have a truncated version saved to the database (rather than causing a fatal + error). +- Allowed aggregator feed items to have URLs longer than 255 characters + (schema change which results in several columns in the Aggregator module's + database tables changing from VARCHAR to TEXT fields). +- Added hook_taxonomy_term_view() and standardized the process for rendering + taxonomy terms to invoke hook_entity_view() and otherwise make it consistent + with other entities (API change: http://drupal.org/node/1808870). +- Added hook_entity_view_mode_alter() to allow modules to change entity view + modes on display (API addition: http://drupal.org/node/1833086). +- Fixed a bug which made database queries running a "LIKE" query on blob fields + fail on PostgreSQL databases. This caused errors during the Drupal 6 to + Drupal 7 upgrade. +- Changed the hook_menu() entry for Drupal's rss.xml page to prevent extra path + components from being accidentally passed to the page callback function (data + structure change). +- Removed a non-standard "name" attribute from Drupal's default Content-Type + header for file downloads. +- Fixed the theme settings form to properly clean up submitted values in + $form_state['values'] when the form is submitted (data structure change). +- Fixed an inconsistency by removing the colon from the end of the label on + multi-valued form fields (minor string change). +- Added support for 'weight' in hook_field_widget_info() to allow modules to + control the order in which widgets are displayed in the Field UI. +- Updated various tables in the OpenID and Book modules to use the default + "empty table" text pattern (string change). +- Added proxy server support to drupal_http_request(). +- Added "lang" attributes to language links, to better support screen readers. +- Fixed double occurrence of a "ul" HTML tag on secondary local tasks in the + Seven theme (markup change). +- Fixed bugs which caused taxonomy vocabulary and shortcut set titles to be + double-escaped. The fix replaces the taxonomy vocabulary overview page and + "Edit shortcuts" menu items' title callback entries in hook_menu() with new + functions that do not escape HTML characters (data structure change). +- Modified the Update manager module to allow drupal.org to collect usage + statistics for individual modules and themes, rather than only for entire + projects. +- Modified the node listing database query on Drupal's default front page to + add table aliases for better query altering (this is a data structure change + affecting code which implements hook_query_alter() on this query). +- Improved the translatability of the "Field type(s) in use" message on the + modules page (admin-facing string change). +- Fixed a regression which caused a "call to undefined function + drupal_find_base_themes()" fatal error under rare circumstances. +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.16, 2012-10-17 +----------------------- +- Fixed security issues (Arbitrary PHP code execution and information + disclosure). See SA-CORE-2012-003. + +Drupal 7.15, 2012-08-01 +----------------------- +- Introduced a 'user_password_reset_timeout' variable to allow the 24-hour + expiration for user password reset links to be adjusted (API addition). +- Fixed database errors due to ambiguous column names that occurred when + EntityFieldQuery was used in certain situations. +- Changed the drupal_array_get_nested_value() function to return a reference + (API addition). +- Changed the System module's hook_block_info() implementation to assign the + "Main page content" and "System help" blocks to appropriate regions by + default and prevent error messages on the block administration page (data + structure change). +- Fixed regression: Non-node entities couldn't be accessed with + EntityFieldQuery. +- Fixed regression: Optional radio buttons with an empty, non-NULL default + value led to an illegal choice error when none were selected. +- Reorganized the testing framework to split setUp() into specific sub-methods + and fix several regressions in the process. +- Fixed bug which made it impossible to search for strings that have not been + translated into a particular language. +- Renamed the "Field" column on the Manage Fields screen to "Field type", since + the former was confusing and inaccurate (UI change). +- Performance improvement: Removed needless call to system_rebuild_module_data() + in field_sync_field_status(), greatly speeding up bulk module enable/disable. +- Fixed bug which prevented notifications from being sent when core, module, and + theme updates are available. +- Fixed bug which prevented sub-themes from inheriting the default values of + theme settings defined by the base theme. +- Fixed bug which prevented the jQuery UI Datepicker from being localized. +- Made Ajax alert dialogs respect error reporting settings. +- Fixed bug which prevented image styles from being deleted on PHP 5.4. +- Fixed bug: Language detection by domain only worked on port 80. +- Fixed regression: The first plural index on a page was not calculated + correctly. +- Introduced generic entity language support. Entities may now declare their + language property in hook_entity_info(), and modules working with entities + may access the language using entity_language() (API change: + http://drupal.org/node/1626346). +- Added EntityFieldQuery support for taxonomy bundles. +- Fixed issue where field form structure was incomplete if field_access() + returned FALSE. Instead of being incomplete, the form structure now has + #access set to FALSE and field form validation is skipped (data structure + change: http://drupal.org/node/1663020). +- Fixed data loss issue due to field_has_data() returning inconsistent results. + The fix adds an optional DANGEROUS_ACCESS_CHECK_OPT_OUT tag to entity field + queries which field storage engines can respond to (API addition: + http://drupal.org/node/1597378). +- Fixed notice: Undefined index: default_image in image_field_prepare_view() +- Numerous API documentation improvements. +- Additional automated test coverage. + +Drupal 7.14, 2012-05-02 +----------------------- +- Fixed "integrity constraint" fatal errors when rebuilding registry. +- Fixed custom logo and favicon functionality referencing incorrect paths. +- Fixed DB Case Sensitivity: Allow BINARY attribute in MySQL. +- Split field_bundle_settings out per bundle. +- Improve UX for machine names for fields (UI change). +- Fixed User pictures are not removed properly. +- Fixed HTTPS sessions not working in all cases. +- Fixed Regression: Required radios throw illegal choice error when none + selected. +- Fixed allow autocompletion requests to include slashes. +- Eliminate $user->cache and {session}.cache in favor of + $_SESSION['cache_expiration'][$bin] (Performance). +- Fixed focus jumps to tab when pressing enter on a form element within tab. +- Fixed race condition in locale() - duplicates in {locales_source}. +- Fixed Missing "Default image" per field instance. +- Quit clobbering people's work when they click the filter tips link +- Form API #states: Fix conditionals to allow OR and XOR constructions. +- Fixed Focus jumps to tab when pressing enter on a form element within tab. + (Accessibility) +- Improved performance of node_access queries. +- Fixed Fieldsets inside vertical tabs have no title and can't be collapsed. +- Reduce size of cache_menu table (Performance). +- Fixed unnecessary aggregation of CSS/JS (Performance). +- Fixed taxonomy_autocomplete() produces SQL error for nonexistent field. +- Fixed HTML filter is not run first by default, despite default weight. +- Fixed Overlay does not work with prefixed URL paths. +- Better debug info for field errors (string change). +- Fixed Data corruption in comment IDs (results in broken threading on + PostgreSQL). +- Fixed machine name not editable if every character is replaced. +- Fixed user picture not appearing in comment preview (Markup change). +- Added optional vid argument for taxonomy_get_term_by_name(). +- Fixed Invalid Unicode code range in PREG_CLASS_UNICODE_WORD_BOUNDARY fails + with PCRE 8.30. +- Fixed {trigger_assignments()}.hook has only 32 characters, is too short. +- Numerous fixes to run-tests.sh. +- Fixed Tests in profiles/[name]/modules cannot be run and cannot use a + different profile for running tests. +- Numerous JavaScript performance fixes. +- Numerous documentation fixes. +- Fixed All pager links have an 'active' CSS class. +- Numerous upgrade path fixes; notably: + - system_update_7061() fails on inserting files with same name but different + case. + - system_update_7061() converts filepaths too aggressively. + - Trigger upgrade path: Node triggers removed when upgrading to 7-x from 6.25. + +Drupal 7.13, 2012-05-02 +----------------------- +- Fixed security issues (Multiple vulnerabilities), see SA-CORE-2012-002. + +Drupal 7.12, 2012-02-01 +----------------------- +- Fixed bug preventing custom menus from receiving an active trail. +- Fixed hook_field_delete() no longer invoked during field_purge_data(). +- Fixed bug causing entity info cache to not be cleared with the rest of caches. +- Fixed file_unmanaged_copy() fails with Drupal 7.7+ and safe_mode() or + open_basedir(). +- Fixed Nested transactions throw exceptions when they got out of scope. +- Fixed bugs with the Return-Path when sending mail on both Windows and + non-Windows systems. +- Fixed bug with DrupalCacheArray property visibility preventing others from + extending it (API change: http://drupal.org/node/1422264). +- Fixed bug with handling of non-ASCII characters in file names (API change: + http://drupal.org/node/1424840). +- Reconciled field maximum length with database column size in image and + aggregator modules. +- Fixes to various core JavaScript files to allow for minification and + aggregation. +- Fixed Prevent tests from deleting main installation's tables when + parent::setUp() is not called. +- Fixed several Poll module bugs. +- Fixed several Shortcut module bugs. +- Added new hook_system_theme_info() to provide ability for contributed modules + to test theme functionality. +- Added ability to cancel mail sending from hook_mail_alter(). +- Added support for configurable PDO connection options, enabling master-master + database replication. +- Numerous improvements to tests and test runner to pave the way for faster test + runs. +- Expanded test coverage. +- Numerous API documentation improvements. +- Numerous performance improvements, including token replacement and render + cache. + +Drupal 7.11, 2012-02-01 +----------------------- +- Fixed security issues (Multiple vulnerabilities), see SA-CORE-2012-001. + +Drupal 7.10, 2011-12-05 +----------------------- +- Fixed Content-Language HTTP header to not cause issues with Drush 5.x. +- Reduce memory usage of theme registry (performance). +- Fixed PECL upload progress bar for FileField +- Fixed running update.php doesn't always clear the cache. +- Fixed PDO exceptions on long titles. +- Fixed Overlay redirect does not include query string. +- Fixed D6 modules satisfy D7 module dependencies. +- Fixed the ordering of module hooks when using module_implements_alter(). +- Fixed "floating" submit buttons during AJAX requests. +- Fixed timezone selected on install not propogating to admin account. +- Added msgctx context to JS translation functions, for feature parity with t(). +- Profiles' .install files now available during hook_install_tasks(). +- Added test coverage of 7.0 -> 7.x upgrade path. +- Numerous notice fixes. +- Numerous documentation improvements. +- Additional automated test coverage. + +Drupal 7.9, 2011-10-26 +---------------------- +- Critical fixes to OpenID to spec violations that could allow for + impersonation in certain scenarios. Existing OpenID users should see + http://drupal.org/node/1120290#comment-5092796 for more information on + transitioning. +- Fixed files getting lost when adding multiple files to multiple file fields + at the same time. +- Improved usability of the clean URL test screens. +- Restored height/width attributes on images run through the theme system. +- Fixed usability bug with first password field being pre-filled by certain + browser plugins. +- Fixed file_usage_list() so that it can return more than one result. +- Fixed bug preventing preview of private images on node form. +- Fixed PDO error when inserting an aggregator title longer than 255 characters. +- Spelled out what TRADITIONAL means in MySQL sql_mode. +- Deprecated "!=" operator for DBTNG; should be "<>". +- Added two new API functions (menu_tree_set_path()/menu_tree_get_path()) were + added in order to enable setting the active menu trail for dynamically + generated menu paths. +- Added new "fast 404" capability in settings.php to bypass Drupal bootstrap + when serving 404 pages for certain file types. +- Added format_string() function which can perform string munging ala the t() + function without the overhead of the translation system. +- Numerous #states system fixes. +- Numerous EntityFieldQuery, DBTNG, and SQLite fixes. +- Numerous Shortcut module fixes. +- Numerous language system fixes. +- Numerous token fixes. +- Numerous CSS fixes. +- Numerous upgrade path fixes. +- Numerous minor string fixes. +- Numerous notice fixes. + +Drupal 7.8, 2011-08-31 +---------------------- +- Fixed critical upgrade path issue with multilingual sites, leading to lost + content. +- Numerous fixes to upgrade path, preventing fatal errors due to incorrect + dependencies. +- Fixed issue with saving files on hosts with open_basedir restrictions. +- Fixed Update manger error when used with Overlay. +- Fixed RTL support in Seven administration theme and Overlay. +- Fixes to nested transaction support. +- Introduced performance pattern to reduce Drupal core's RAM usage. +- Added support for HTML 5 tags to filter_xss_admin(). +- Added exception handling to cron. +- Added new hook hook_field_widget_form_alter() for contribtued modules. +- element_validate_*() functions now available to contrib. +- Added new maintainers for several subsystems. +- Numerous testing system improvements. +- Numerous markup and CSS fixes. +- Numerous poll module fixes. +- Numerous notice/warning fixes. +- Numerous documentation fixes. +- Numerous token fixes. + +Drupal 7.7, 2011-07-27 +---------------------- +- Fixed VERSION string. + +Drupal 7.6, 2011-07-27 +---------------------- +- Fixed support for remote streamwrappers. +- AJAX now binds to 'click' instead of 'mousedown'. +- 'Translatable' flag on fields created in UI now defaults to FALSE, to match those created via the API. +- Performance enhancement to permissions page on large numbers of permissions. +- More secure password generation. +- Fix for temporary directory on Windows servers. +- run-tests.sh now uses proc_open() instead of pcntl_fork() for better Windows support. +- Numerous upgrade path fixes. +- Numerous documentation fixes. +- Numerous notice fixes. +- Numerous fixes to improve PHP 5.4 support. +- Numerous RTL improvements. + +Drupal 7.5, 2011-07-27 +---------------------- +- Fixed security issue (Access bypass), see SA-CORE-2011-003. + +Drupal 7.4, 2011-06-29 +---------------------- +- Rolled back patch that caused fatal errors in CTools, Feeds, and other modules using the class registry. +- Fixed critical bug with saving default images. +- Fixed fatal errors when uninstalling some modules. +- Added workaround for MySQL transaction support breaking on DDL statments. +- Improved page caching with external caching systems. +- Fix to Batch API, which was terminating too early. +- Numerous upgrade path fixes. +- Performance fixes. +- Additional test coverage. +- Numerous documentation fixes. + +Drupal 7.3, 2011-06-29 +---------------------- +- Fixed security issue (Access bypass), see SA-CORE-2011-002. + +Drupal 7.2, 2011-05-25 +---------------------- +- Added a default .gitignore file. +- Improved PostgreSQL and SQLite support. +- Numerous critical performance improvements. +- Numerous critical fixes to the upgrade path. +- Numerous fixes to language and translation systems. +- Numerous fixes to AJAX and #states systems. +- Improvements to the locking system. +- Numerous documentation fixes. +- Numerous styling and theme system fixes. +- Numerous fixes for schema mis-matches between Drupal 6 and 7. +- Minor internal API clean-ups. + +Drupal 7.1, 2011-05-25 +---------------------- +- Fixed security issues (Cross site scripting, File access bypass), see SA-CORE-2011-001. + +Drupal 7.0, 2011-01-05 +---------------------- +- Database: + * Fully rewritten database layer utilizing PHP 5's PDO abstraction layer. + * Drupal now requires MySQL >= 5.0.15 or PostgreSQL >= 8.3. + * Added query builders for INSERT, UPDATE, DELETE, MERGE, and SELECT queries. + * Support for master/slave replication, transactions, multi-insert queries, + and other features. + * Added support for the SQLite database engine. + * Default to InnoDB engine, rather than MyISAM, on MySQL when available. + This offers increased scalability and data integrity. +- Security: + * Protected cron.php -- cron will only run if the proper key is provided. + * Implemented a pluggable password system and much stronger password hashes + that are compatible with the Portable PHP password hashing framework. + * Rate limited login attempts to prevent brute-force password guessing, and + improved the flood control API to allow variable time windows and + identifiers for limiting user access to resources. + * Transformed the "Update status" module into the "Update manager" which + can securely install or update modules and themes via a web interface. +- Usability: + * Added contextual links (a.k.a. local tasks) to page elements, such as + blocks, nodes, or comments, which allows to perform the most common tasks + with a single click only. + * Improved installer requirements check. + * Improved support for integration of WYSIWYG editors. + * Implemented drag-and-drop positioning for input format listings. + * Implemented drag-and-drop positioning for language listing. + * Implemented drag-and-drop positioning for poll options. + * Provided descriptions and human-readable names for user permissions. + * Removed comment controls for users. + * Removed display order settings for comment module. Comment display + order can now be customized using the Views module. + * Removed the 'related terms' feature from taxonomy module since this can + now be achieved with Field API. + * Added additional features to the default installation profile, and + implemented a "slimmed down" profile designed for developers. + * Added a built-in, automated cron run feature, which is triggered by site + visitors. + * Added an administrator role which is assigned all permissions for + installed modules automatically. + * Image toolkits are now provided by modules (rather than requiring a + manual file copy to the includes directory). + * Added an edit tab to taxonomy term pages. + * Redesigned password strength validator. + * Redesigned the add content type screen. + * Highlight duplicate URL aliases. + * Renamed "input formats" to "text formats". + * Moved text format permissions to the main permissions page. + * Added configurable ability for users to cancel their own accounts. + * Added "vertical tabs", a reusable interface component that features + automatic summaries and increases usability. + * Replaced fieldsets on node edit and add pages with vertical tabs. +- Performance: + * Improved performance on uncached page views by loading multiple core + objects in a single database query. + * Improved performance for logged-in users by reducing queries for path + alias lookups. + * Improved support for HTTP proxies (including reverse proxies), allowing + anonymous page views to be served entirely from the proxy. +- Documentation: + * Hook API documentation now included in Drupal core. +- News aggregator: + * Added OPML import functionality for RSS feeds. + * Optionally, RSS feeds may be configured to not automatically generate feed blocks. +- Search: + * Added support for language-aware searches. +- Aggregator: + * Introduced architecture that allows pluggable parsers and processors for + syndicating RSS and Atom feeds. + * Added options to suspend updating specific feeds and never discard feeds + items. +- Testing: + * Added test framework and tests. +- Improved time zone support: + * Drupal now uses PHP's time zone database when rendering dates in local + time. Site-wide and user-configured time zone offsets have been converted + to time zone names, e.g. Africa/Abidjan. + * In some cases the upgrade and install scripts do not choose the preferred + site default time zone. The automatically-selected time zone can be + corrected at admin/config/regional/settings. + * If your site is being upgraded from Drupal 6 and you do not have the + contributed date or event modules installed, user time zone settings will + fallback to the system time zone and will have to be reconfigured by each user. + * User-configured time zones now serve as the default time zone for PHP + date/time functions. +- Filter system: + * Revamped the filter API and text format storage. + * Added support for default text formats to be assigned on a per-role basis. + * Refactored the HTML corrector to take advantage of PHP 5 features. +- User system: + * Added clean API functions for creating, loading, updating, and deleting + user roles and permissions. + * Refactored the "access rules" component of user module: The user module + now provides a simple interface for blocking single IP addresses. The + previous functionality in the user module for restricting certain e-mail + addresses and usernames is now available as a contributed module. Further, + IP address range blocking is no longer supported and should be implemented + at the operating system level. + * Removed per-user themes: Contributed modules with similar functionality + are available. +- OpenID: + * Added support for Gmail and Google Apps for Domain identifiers. Users can + now login with their user@example.com identifier when example.com is powered + by Google. + * Made the OpenID module more pluggable. +- Added code registry: + * Using the registry, modules declare their includable files via their .info file, + allowing Drupal to lazy-load classes and interfaces as needed. +- Theme system: + * Removed the Bluemarine, Chameleon and Pushbutton themes. These themes live + on as contributed themes (http://drupal.org/project/bluemarine, + http://drupal.org/project/chameleon and http://drupal.org/project/pushbutton). + * Added Stark theme to make analyzing Drupal's default HTML and CSS easier. + * Added Seven as the default administration theme. + * Variable preprocessing of theme hooks prior to template rendering now goes + through two phases: a 'preprocess' phase and a new 'process' phase. See + http://api.drupal.org/api/function/theme/7 for details. + * Theme hooks implemented as functions (rather than as templates) can now + also have preprocess (and process) functions. See + http://api.drupal.org/api/function/theme/7 for details. + * Added Bartik as the default theme. +- File handling: + * Files are now first class Drupal objects with file_load(), file_save(), + and file_validate() functions and corresponding hooks. + * The file_move(), file_copy() and file_delete() functions now operate on + file objects and invoke file hooks so that modules are notified and can + respond to changes. + * For the occasions when only basic file manipulation are needed--such as + uploading a site logo--that don't require the overhead of databases and + hooks, the current unmanaged copy, move and delete operations have been + preserved but renamed to file_unmanaged_*(). + * Rewrote file handling to use PHP stream wrappers to enable support for + both public and private files and to support pluggable storage mechanisms + and access to remote resources (e.g. S3 storage or Flickr photos). + * The mime_extension_mapping variable has been removed. Modules that need to + alter the default MIME type extension mappings should implement + hook_file_mimetype_mapping_alter(). + * Added the hook_file_url_alter() hook, which makes it possible to serve + files from a CDN. + * Added a field specifically for uploading files, previously provided by + the contributed module FileField. +- Image handling: + * Improved image handling, including better support for add-on image + libraries. + * Added API and interface for creating advanced image thumbnails. + * Inclusion of additional effects such as rotate and desaturate. + * Added a field specifically for uploading images, previously provided by + the contributed module ImageField. +- Added aliased multi-site support: + * Added support for mapping domain names to sites directories. +- Added RDF support: + * Modules can declare RDF namespaces which are serialized in the <html> tag + for RDFa support. + * Modules can specify how their data structure maps to RDF. + * Added support for RDFa export of nodes, comments, terms, users, etc. and + their fields. +- Search engine optimization and web linking: + * Added a rel="canonical" link on node and comment pages to prevent + duplicate content indexing by search engines. + * Added a default rel="shortlink" link on node and comment pages that + advertises a short link as an alternative URL to third-party services. + * Meta information is now alterable by all modules before rendering. +- Field API: + * Custom data fields may be attached to nodes, users, comments and taxonomy + terms. + * Node bodies and teasers are now Field API fields instead of + being a hard-coded property of node objects. + * In addition, any other object type may register with Field API + and allow custom data fields to be attached to itself. + * Provides most of the features of the former Content Construction + Kit (CCK) module. + * Taxonomy terms are now Field API fields that can be added to any fieldable + object. +- Installer: + * Refactored the installer into an API that allows Drupal to be installed + via a command line script. +- Page organization + * Made the help text area a full featured region with blocks. + * Site mission is replaced with the highlighted content block region and + separate RSS feed description settings. + * The footer message setting was removed in favor of custom blocks. + * Made the main page content a block which can be moved and ordered + with other blocks in the same region. + * Blocks can now return structured arrays for later rendering just + like page callbacks. +- Translation system + * The translation system now supports message context (msgctxt). + * Added support for translatable fields to Field API. +- JavaScript changes + * Upgraded the core JavaScript library to jQuery version 1.4.4. + * Upgraded the jQuery Forms library to 2.52. + * Added jQuery UI 1.8.7, which allows improvements to Drupal's user + experience. +- Better module version support + * Modules now can specify which version of another module they depend on. +- Removed modules from core + * The following modules have been removed from core, because contributed + modules with similar functionality are available: + * Blog API module + * Ping module + * Throttle module +- Improved node access control system. + * All modules may now influence the access to a node at runtime, not just + the module that defined a node. + * Users may now be allowed to bypass node access restrictions without giving + them complete access to the site. + * Access control affects both published and unpublished nodes. + * Numerous other improvements to the node access system. +- Actions system + * Simplified definitions of actions and triggers. + * Removed dependency on the combination of hooks and operations. Triggers + now directly map to module hooks. +- Task handling + * Added a queue API to process many or long-running tasks. + * Added queue API support to cron API. + * Added a locking framework to coordinate long-running operations across + requests. + +Drupal 6.23-dev, xxxx-xx-xx (development release) +--------------------------- + +Drupal 6.22, 2011-05-25 +----------------------- +- Made Drupal 6 work better with IIS and Internet Explorer. +- Fixed .po file imports to work better with custom textgroups. +- Improved code documentation at various places. +- Fixed a variety of other bugs. + +Drupal 6.21, 2011-05-25 +----------------------- +- Fixed security issues (Cross site scripting), see SA-CORE-2011-001. + +Drupal 6.20, 2010-12-15 +----------------------- +- Fixed a variety of small bugs, improved code documentation. + +Drupal 6.19, 2010-08-11 +----------------------- +- Fixed a variety of small bugs, improved code documentation. + +Drupal 6.18, 2010-08-11 +----------------------- +- Fixed security issues (OpenID authentication bypass, File download access + bypass, Comment unpublishing bypass, Actions cross site scripting), + see SA-CORE-2010-002. + +Drupal 6.17, 2010-06-02 +----------------------- +- Improved PostgreSQL compatibility +- Better PHP 5.3 and PHP 4 compatibility +- Better browser compatibility of CSS and JS aggregation +- Improved logging for login failures +- Fixed an incompatibility with some contributed modules and the locking system +- Fixed a variety of other bugs. + +Drupal 6.16, 2010-03-03 +----------------------- +- Fixed security issues (Installation cross site scripting, Open redirection, + Locale module cross site scripting, Blocked user session regeneration), + see SA-CORE-2010-001. +- Better support for updated jQuery versions. +- Reduced resource usage of update.module. +- Fixed several issues relating to support of installation profiles and + distributions. +- Added a locking framework to avoid data corruption on long operations. +- Fixed a variety of other bugs. + +Drupal 6.15, 2009-12-16 +----------------------- +- Fixed security issues (Cross site scripting), see SA-CORE-2009-009. +- Fixed a variety of other bugs. + +Drupal 6.14, 2009-09-16 +----------------------- +- Fixed security issues (OpenID association cross site request forgeries, + OpenID impersonation and File upload), see SA-CORE-2009-008. +- Changed the system modules page to not run all cache rebuilds; use the + button on the performance settings page to achieve the same effect. +- Added support for PHP 5.3.0 out of the box. +- Fixed a variety of small bugs. + +Drupal 6.13, 2009-07-01 +----------------------- +- Fixed security issues (Cross site scripting, Input format access bypass and + Password leakage in URL), see SA-CORE-2009-007. +- Fixed a variety of small bugs. + +Drupal 6.12, 2009-05-13 +----------------------- +- Fixed security issues (Cross site scripting), see SA-CORE-2009-006. +- Fixed a variety of small bugs. + +Drupal 6.11, 2009-04-29 +----------------------- +- Fixed security issues (Cross site scripting and limited information + disclosure), see SA-CORE-2009-005 +- Fixed performance issues with the menu router cache, the update + status cache and improved cache invalidation +- Fixed a variety of small bugs. + +Drupal 6.10, 2009-02-25 +----------------------- +- Fixed a security issue, (Local file inclusion on Windows), + see SA-CORE-2009-003 +- Fixed node_feed() so custom fields can show up in RSS feeds. +- Improved PostgreSQL compatibility. +- Fixed a variety of small bugs. + +Drupal 6.9, 2009-01-14 +---------------------- +- Fixed security issues, (Access Bypass, Validation Bypass and Hardening + against SQL injection), see SA-CORE-2009-001 +- Made HTTP request checking more robust and informative. +- Fixed HTTP_HOST checking to work again with HTTP 1.0 clients and + basic shell scripts. +- Removed t() calls from all schema documentation. Suggested best practice + changed for contributed modules, see http://drupal.org/node/322731. +- Fixed a variety of small bugs. + +Drupal 6.8, 2008-12-11 +---------------------- +- Removed a previous change incompatible with PHP 5.1.x and lower. + +Drupal 6.7, 2008-12-10 +---------------------- +- Fixed security issues, (Cross site request forgery and Cross site scripting), see SA-2008-073 +- Updated robots.txt and .htaccess to match current file use. +- Fixed a variety of small bugs. + +Drupal 6.6, 2008-10-22 +---------------------- +- Fixed security issues, (File inclusion, Cross site scripting), see SA-2008-067 +- Fixed a variety of small bugs. + +Drupal 6.5, 2008-10-08 +---------------------- +- Fixed security issues, (File upload access bypass, Access rules bypass, + BlogAPI access bypass), see SA-2008-060. +- Fixed a variety of small bugs. + +Drupal 6.4, 2008-08-13 +---------------------- +- Fixed a security issue (Cross site scripting, Arbitrary file uploads via + BlogAPI, Cross site request forgeries and Various Upload module + vulnerabilities), see SA-2008-047. +- Improved error messages during installation. +- Fixed a bug that prevented AHAH handlers to be attached to radios widgets. +- Fixed a variety of small bugs. + +Drupal 6.3, 2008-07-09 +---------------------- +- Fixed security issues, (Cross site scripting, cross site request forgery, + session fixation and SQL injection), see SA-2008-044. +- Slightly modified installation process to prevent file ownership issues on + shared hosts. +- Improved PostgreSQL compatibility (rewritten queries; custom blocks). +- Upgraded to jQuery 1.2.6. +- Performance improvements to search, menu handling and form API caches. +- Fixed Views compatibility issues (Views for Drupal 6 requires Drupal 6.3+). +- Fixed a variety of small bugs. + +Drupal 6.2, 2008-04-09 +---------------------- +- Fixed a variety of small bugs. +- Fixed a security issue (Access bypasses), see SA-2008-026. + +Drupal 6.1, 2008-02-27 +---------------------- +- Fixed a variety of small bugs. +- Fixed a security issue (Cross site scripting), see SA-2008-018. + +Drupal 6.0, 2008-02-13 +---------------------- +- New, faster and better menu system. +- New watchdog as a hook functionality. + * New hook_watchdog that can be implemented by any module to route log + messages to various destinations. + * Expands the severity levels from 3 (Error, Warning, Notice) to the 8 + levels defined in RFC 3164. + * The watchdog module is now called dblog, and is optional, but enabled by + default in the default installation profile. + * Extended the database log module so log messages can be filtered. + * Added syslog module: useful for monitoring large Drupal installations. +- Added optional e-mail notifications when users are approved, blocked, or + deleted. +- Drupal works with error reporting set to E_ALL. +- Added scripts/drupal.sh to execute Drupal code from the command line. Useful + to use Drupal as a framework to build command-line tools. +- Made signature support optional and made it possible to theme signatures. +- Made it possible to filter the URL aliases on the URL alias administration + screen. +- Language system improvements: + * Support for right to left languages. + * Language detection based on parts of the URL. + * Browser based language detection. + * Made it possible to specify a node's language. + * Support for translating posts on the site to different languages. + * Language dependent path aliases. + * Automatically import translations when adding a new language. + * JavaScript interface translation. + * Automatically import a module's translation upon enabling that module. +- Moved "PHP input filter" to a standalone module so it can be deleted for + security reasons. +- Usability: + * Improved handling of teasers in posts. + * Added sticky table headers. + * Check for clean URL support automatically with JavaScript. + * Removed default/settings.php. Instead the installer will create it from + default.settings.php. + * Made it possible to configure your own date formats. + * Remember anonymous comment posters. + * Only allow modules and themes to be enabled that have explicitly been + ported to the correct core API version. + * Can now specify the minimum PHP version required for a module within the + .info file. + * Drupal core no longer requires CREATE TEMPORARY TABLES or LOCK TABLES + database rights. + * Dynamically check password strength and confirmation. + * Refactored poll administration. + * Implemented drag-and-drop positioning for blocks, menu items, taxonomy + vocabularies and terms, forums, profile fields, and input format filters. +- Theme system: + * Added .info files to themes and made it easier to specify regions and + features. + * Added theme registry: modules can directly provide .tpl.php files for + their themes without having to create theme_ functions. + * Used the Garland theme for the installation and maintenance pages. + * Added theme preprocess functions for themes that are templates. + * Added support for themeable functions in JavaScript. +- Refactored update.php to a generic batch API to be able to run time-consuming + operations in multiple subsequent HTTP requests. +- Installer: + * Themed the installer with the Garland theme. + * Added form to provide initial site information during installation. + * Added ability to provide extra installation steps programmatically. + * Made it possible to import interface translations during installation. +- Added the HTML corrector filter: + * Fixes faulty and chopped off HTML in postings. + * Tags are now automatically closed at the end of the teaser. +- Performance: + * Made it easier to conditionally load .include files and split up many core + modules. + * Added a JavaScript aggregator. + * Added block-level caching, improving performance for both authenticated + and anonymous users. + * Made Drupal work correctly when running behind a reverse proxy like + Squid or Pound. +- File handling improvements: + * Entries in the files table are now keyed to a user instead of a node. + * Added reusable validation functions to check for uploaded file sizes, + extensions, and image resolution. + * Added ability to create and remove temporary files during a cron job. +- Forum improvements: + * Any node type may now be posted in a forum. +- Taxonomy improvements: + * Descriptions for terms are now shown on taxonomy/term pages as well + as RSS feeds. + * Added versioning support to categories by associating them with node + revisions. +- Added support for OpenID. +- Added support for triggering configurable actions. +- Added the Update status module to automatically check for available updates + and warn sites if they are missing security updates or newer versions. + Sites deploying from CVS should use http://drupal.org/project/cvs_deploy. + Advanced settings provided by http://drupal.org/project/update_advanced. +- Upgraded the core JavaScript library to jQuery version 1.2.3. +- Added a new Schema API, which provides built-in support for core and + contributed modules to work with databases other than MySQL. +- Removed drupal.module. The functionality lives on as the Site network + contributed module (http://drupal.org/project/site_network). +- Removed old system updates. Updates from Drupal versions prior to 5.x will + require upgrading to 5.x before upgrading to 6.x. + +Drupal 5.23, 2010-08-11 +----------------------- +- Fixed security issues (File download access bypass, Comment unpublishing + bypass), see SA-CORE-2010-002. + +Drupal 5.22, 2010-03-03 +----------------------- +- Fixed security issues (Open redirection, Locale module cross site scripting, + Blocked user session regeneration), see SA-CORE-2010-001. + +Drupal 5.21, 2009-12-16 +----------------------- +- Fixed a security issue (Cross site scripting), see SA-CORE-2009-009. +- Fixed a variety of small bugs. + +Drupal 5.20, 2009-09-16 +----------------------- +- Avoid security problems resulting from writing Drupal 6-style menu + declarations. +- Fixed security issues (session fixation), see SA-CORE-2009-008. +- Fixed a variety of small bugs. + +Drupal 5.19, 2009-07-01 +----------------------- +- Fixed security issues (Cross site scripting and Password leakage in URL), see + SA-CORE-2009-007. +- Fixed a variety of small bugs. + +Drupal 5.18, 2009-05-13 +----------------------- +- Fixed security issues (Cross site scripting), see SA-CORE-2009-006. +- Fixed a variety of small bugs. + +Drupal 5.17, 2009-04-29 +----------------------- +- Fixed security issues (Cross site scripting and limited information + disclosure) see SA-CORE-2009-005. +- Fixed a variety of small bugs. + +Drupal 5.16, 2009-02-25 +----------------------- +- Fixed a security issue, (Local file inclusion on Windows), see SA-CORE-2009-004. +- Fixed a variety of small bugs. + +Drupal 5.15, 2009-01-14 +----------------------- +- Fixed security issues, (Hardening against SQL injection), see + SA-CORE-2009-001 +- Fixed HTTP_HOST checking to work again with HTTP 1.0 clients and basic shell + scripts. +- Fixed a variety of small bugs. + +Drupal 5.14, 2008-12-11 +----------------------- +- removed a previous change incompatible with PHP 5.1.x and lower. + +Drupal 5.13, 2008-12-10 +----------------------- +- fixed a variety of small bugs. +- fixed security issues, (Cross site request forgery and Cross site scripting), see SA-2008-073 +- updated robots.txt and .htaccess to match current file use. + +Drupal 5.12, 2008-10-22 +----------------------- +- fixed security issues, (File inclusion), see SA-2008-067 + +Drupal 5.11, 2008-10-08 +----------------------- +- fixed a variety of small bugs. +- fixed security issues, (File upload access bypass, Access rules bypass, + BlogAPI access bypass, Node validation bypass), see SA-2008-060 + +Drupal 5.10, 2008-08-13 +----------------------- +- fixed a variety of small bugs. +- fixed security issues, (Cross site scripting, Arbitrary file uploads via + BlogAPI and Cross site request forgery), see SA-2008-047 + +Drupal 5.9, 2008-07-23 +---------------------- +- fixed a variety of small bugs. +- fixed security issues, (Session fixation), see SA-2008-046 + +Drupal 5.8, 2008-07-09 +---------------------- +- fixed a variety of small bugs. +- fixed security issues, (Cross site scripting, cross site request forgery, and + session fixation), see SA-2008-044 + +Drupal 5.7, 2008-01-28 +---------------------- +- fixed the input format configuration page. +- fixed a variety of small bugs. + +Drupal 5.6, 2008-01-10 +---------------------- +- fixed a variety of small bugs. +- fixed a security issue (Cross site request forgery), see SA-2008-005 +- fixed a security issue (Cross site scripting, UTF8), see SA-2008-006 +- fixed a security issue (Cross site scripting, register_globals), see SA-2008-007 + +Drupal 5.5, 2007-12-06 +---------------------- +- fixed missing missing brackets in a query in the user module. +- fixed taxonomy feed bug introduced by SA-2007-031 + +Drupal 5.4, 2007-12-05 +---------------------- +- fixed a variety of small bugs. +- fixed a security issue (SQL injection), see SA-2007-031 + +Drupal 5.3, 2007-10-17 +---------------------- +- fixed a variety of small bugs. +- fixed a security issue (HTTP response splitting), see SA-2007-024 +- fixed a security issue (Arbitrary code execution via installer), see SA-2007-025 +- fixed a security issue (Cross site scripting via uploads), see SA-2007-026 +- fixed a security issue (User deletion cross site request forgery), see SA-2007-029 +- fixed a security issue (API handling of unpublished comment), see SA-2007-030 + +Drupal 5.2, 2007-07-26 +---------------------- +- changed hook_link() $teaser argument to match documentation. +- fixed a variety of small bugs. +- fixed a security issue (cross-site request forgery), see SA-2007-017 +- fixed a security issue (cross-site scripting), see SA-2007-018 + +Drupal 5.1, 2007-01-29 +---------------------- +- fixed security issue (code execution), see SA-2007-005 +- fixed a variety of small bugs. + +Drupal 5.0, 2007-01-15 +---------------------- +- Completely retooled the administration page + * /Admin now contains an administration page which may be themed + * Reorganised administration menu items by task and by module + * Added a status report page with detailed PHP/MySQL/Drupal information +- Added web-based installer which can: + * Check installation and run-time requirements + * Automatically generate the database configuration file + * Install pre-made installation profiles or distributions + * Import the database structure with automatic table prefixing + * Be localized +- Added new default Garland theme +- Added color module to change some themes' color schemes +- Included the jQuery JavaScript library 1.0.4 and converted all core JavaScript to use it +- Introduced the ability to alter mail sent from system +- Module system: + * Added .info files for module meta-data + * Added support for module dependencies + * Improved module installation screen + * Moved core modules to their own directories + * Added support for module uninstalling +- Added support for different cache backends +- Added support for a generic "sites/all" directory. +- Usability: + * Added support for auto-complete forms (AJAX) to user profiles. + * Made it possible to instantly assign roles to newly created user accounts. + * Improved configurability of the contact forms. + * Reorganized the settings pages. + * Made it easy to investigate popular search terms. + * Added a 'select all' checkbox and a range select feature to administration tables. + * Simplified the 'break' tag to split teasers from body. + * Use proper capitalization for titles, menu items and operations. +- Integrated urlfilter.module into filter.module +- Block system: + * Extended the block visibility settings with a role specific setting. + * Made it possible to customize all block titles. +- Poll module: + * Optionally allow people to inspect all votes. + * Optionally allow people to cancel their vote. +- Distributed authentication: + * Added default server option. +- Added default robots.txt to control crawlers. +- Database API: + * Added db_table_exists(). +- Blogapi module: + * 'Blogapi new' and 'blogapi edit' nodeapi operations. +- User module: + * Added hook_profile_alter(). + * E-mail verification is made optional. + * Added mass editing and filtering on admin/user/user. +- PHP Template engine: + * Add the ability to look for a series of suggested templates. + * Look for page templates based upon the path. + * Look for block templates based upon the region, module, and delta. +- Content system: + * Made it easier for node access modules to work well with each other. + * Added configurable content types. + * Changed node rendering to work with structured arrays. +- Performance: + * Improved session handling: reduces database overhead. + * Improved access checking: reduces database overhead. + * Made it possible to do memcached based session management. + * Omit sidebars when serving a '404 - Page not found': saves CPU cycles and bandwidth. + * Added an 'aggressive' caching policy. + * Added a CSS aggregator and compressor (up to 40% faster page loads). +- Removed the archive module. +- Upgrade system: + * Created space for update branches. +- Form API: + * Made it possible to programmatically submit forms. + * Improved api for multistep forms. +- Theme system: + * Split up and removed drupal.css. + * Added nested lists generation. + * Added a self-clearing block class. + +Drupal 4.7.11, 2008-01-10 +------------------------- +- fixed a security issue (Cross site request forgery), see SA-2008-005 +- fixed a security issue (Cross site scripting, UTF8), see SA-2008-006 +- fixed a security issue (Cross site scripting, register_globals), see SA-2008-007 + +Drupal 4.7.10, 2007-12-06 +------------------------- +- fixed taxonomy feed bug introduced by SA-2007-031 + +Drupal 4.7.9, 2007-12-05 +------------------------ +- fixed a security issue (SQL injection), see SA-2007-031 + +Drupal 4.7.8, 2007-10-17 +------------------------ +- fixed a security issue (HTTP response splitting), see SA-2007-024 +- fixed a security issue (Cross site scripting via uploads), see SA-2007-026 +- fixed a security issue (API handling of unpublished comment), see SA-2007-030 + +Drupal 4.7.7, 2007-07-26 +------------------------ +- fixed security issue (XSS), see SA-2007-018 + +Drupal 4.7.6, 2007-01-29 +------------------------ +- fixed security issue (code execution), see SA-2007-005 + +Drupal 4.7.5, 2007-01-05 +------------------------ +- Fixed security issue (XSS), see SA-2007-001 +- Fixed security issue (DoS), see SA-2007-002 + +Drupal 4.7.4, 2006-10-18 +------------------------ +- Fixed security issue (XSS), see SA-2006-024 +- Fixed security issue (CSRF), see SA-2006-025 +- Fixed security issue (Form action attribute injection), see SA-2006-026 + +Drupal 4.7.3, 2006-08-02 +------------------------ +- Fixed security issue (XSS), see SA-2006-011 + +Drupal 4.7.2, 2006-06-01 +------------------------ +- Fixed critical upload issue, see SA-2006-007 +- Fixed taxonomy XSS issue, see SA-2006-008 +- Fixed a variety of small bugs. + +Drupal 4.7.1, 2006-05-24 +------------------------ +- Fixed critical SQL issue, see SA-2006-005 +- Fixed a serious upgrade related bug. +- Fixed a variety of small bugs. + +Drupal 4.7.0, 2006-05-01 +------------------------ +- Added free tagging support. +- Added a site-wide contact form. +- Theme system: + * Added the PHPTemplate theme engine and removed the Xtemplate engine. + * Converted the bluemarine theme from XTemplate to PHPTemplate. + * Converted the pushbutton theme from XTemplate to PHPTemplate. +- Usability: + * Reworked the 'request new password' functionality. + * Reworked the node and comment edit forms. + * Made it easy to add nodes to the navigation menu. + * Added site 'offline for maintenance' feature. + * Added support for auto-complete forms (AJAX). + * Added support for collapsible page sections (JS). + * Added support for resizable text fields (JS). + * Improved file upload functionality (AJAX). + * Reorganized some settings pages. + * Added friendly database error screens. + * Improved styling of update.php. +- Refactored the forms API. + * Made it possible to alter, extend or theme forms. +- Comment system: + * Added support for "mass comment operations" to ease repetitive tasks. + * Comment moderation has been removed. +- Node system: + * Reworked the revision functionality. + * Removed the bookmarklet code. Third-party modules can now handle + This. +- Upgrade system: + * Allows contributed modules to plug into the upgrade system. +- Profiles: + * Added a block to display author information along with posts. + * Added support for private profile fields. +- Statistics module: + * Added the ability to track page generation times. + * Made it possible to block certain IPs/hostnames. +- Block system: + * Added support for theme-specific block regions. +- Syndication: + * Made the aggregator module parse Atom feeds. + * Made the aggregator generate RSS feeds. + * Added RSS feed settings. +- XML-RPC: + * Replaced the XML-RPC library by a better one. +- Performance: + * Added 'loose caching' option for high-traffic sites. + * Improved performance of path aliasing. + * Added the ability to track page generation times. +- Internationalization: + * Improved Unicode string handling API. + * Added support for PHP's multibyte string module. +- Added support for PHP5's 'mysqli' extension. +- Search module: + * Made indexer smarter and more robust. + * Added advanced search operators (e.g. phrase, node type, ...). + * Added customizable result ranking. +- PostgreSQL support: + * Removed dependency on PL/pgSQL procedural language. +- Menu system: + * Added support for external URLs. +- Queue module: + * Removed from core. +- HTTP handling: + * Added support for a tolerant Base URL. + * Output URIs relative to the root, without a base tag. + +Drupal 4.6.11, 2007-01-05 +------------------------- +- Fixed security issue (XSS), see SA-2007-001 +- Fixed security issue (DoS), see SA-2007-002 + +Drupal 4.6.10, 2006-10-18 +------------------------- +- Fixed security issue (XSS), see SA-2006-024 +- Fixed security issue (CSRF), see SA-2006-025 +- Fixed security issue (Form action attribute injection), see SA-2006-026 + +Drupal 4.6.9, 2006-08-02 +------------------------ +- Fixed security issue (XSS), see SA-2006-011 + +Drupal 4.6.8, 2006-06-01 +------------------------ +- Fixed critical upload issue, see SA-2006-007 +- Fixed taxonomy XSS issue, see SA-2006-008 + +Drupal 4.6.7, 2006-05-24 +------------------------ +- Fixed critical SQL issue, see SA-2006-005 + +Drupal 4.6.6, 2006-03-13 +------------------------ +- Fixed bugs, including 4 security vulnerabilities. + +Drupal 4.6.5, 2005-12-12 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.6.4, 2005-11-30 +------------------------ +- Fixed bugs, including 3 security vulnerabilities. + +Drupal 4.6.3, 2005-08-15 +------------------------ +- Fixed bugs, including a critical "arbitrary PHP code execution" bug. + +Drupal 4.6.2, 2005-06-29 +------------------------ +- Fixed bugs, including two critical "arbitrary PHP code execution" bugs. + +Drupal 4.6.1, 2005-06-01 +------------------------ +- Fixed bugs, including a critical input validation bug. + +Drupal 4.6.0, 2005-04-15 +------------------------ +- PHP5 compliance +- Search: + * Added UTF-8 support to make it work with all languages. + * Improved search indexing algorithm. + * Improved search output. + * Impose a throttle on indexing of large sites. + * Added search block. +- Syndication: + * Made the ping module ping pingomatic.com which, in turn, will ping all the major ping services. + * Made Drupal generate RSS 2.0 feeds. + * Made RSS feeds extensible. + * Added categories to RSS feeds. + * Added enclosures to RSS feeds. +- Flood control mechanism: + * Added a mechanism to throttle certain operations. +- Usability: + * Refactored the block configuration pages. + * Refactored the statistics pages. + * Refactored the watchdog pages. + * Refactored the throttle module configuration. + * Refactored the access rules page. + * Refactored the content administration page. + * Introduced forum configuration pages. + * Added a 'add child page' link to book pages. +- Contact module: + * Added a simple contact module that allows users to contact each other using e-mail. +- Multi-site configuration: + * Made it possible to run multiple sites from a single code base. +- Added an image API: enables better image handling. +- Block system: + * Extended the block visibility settings. +- Theme system: + * Added new theme functions. +- Database backend: + * The PEAR database backend is no longer supported. +- Performance: + * Improved performance of the forum topics block. + * Improved performance of the tracker module. + * Improved performance of the node pages. +- Documentation: + * Improved and extended PHPDoc/Doxygen comments. + +Drupal 4.5.8, 2006-03-13 +------------------------ +- Fixed bugs, including 3 security vulnerabilities. + +Drupal 4.5.7, 2005-12-12 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.5.6, 2005-11-30 +------------------------ +- Fixed bugs, including 3 security vulnerabilities. + +Drupal 4.5.5, 2005-08-15 +------------------------ +- Fixed bugs, including a critical "arbitrary PHP code execution" bug. + +Drupal 4.5.4, 2005-06-29 +------------------------ +- Fixed bugs, including two critical "arbitrary PHP code execution" bugs. + +Drupal 4.5.3, 2005-06-01 +------------------------ +- Fixed bugs, including a critical input validation bug. + +Drupal 4.5.2, 2005-01-15 +------------------------ +- Fixed bugs: a cross-site scripting (XSS) vulnerability has been fixed. + +Drupal 4.5.1, 2004-12-01 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.5.0, 2004-10-18 +------------------------ +- Navigation: + * Made it possible to add, delete, rename and move menu items. + * Introduced tabs and subtabs for local tasks. + * Reorganized the navigation menus. +- User management: + * Added support for multiple roles per user. + * Made it possible to add custom profile fields. + * Made it possible to browse user profiles by field. +- Node system: + * Added support for node-level permissions. +- Comment module: + * Made it possible to leave contact information without having to register. +- Upload module: + * Added support for uploading documents (includes images). +- Forum module: + * Added support for sticky forum topics. + * Made it possible to track forum topics. +- Syndication: + * Added support for RSS ping-notifications of http://technorati.com/. + * Refactored the categorization of syndicated news items. + * Added an URL alias for 'rss.xml'. + * Improved date parsing. +- Database backend: + * Added support for multiple database connections. + * The PostgreSQL backend does no longer require PEAR. +- Theme system: + * Changed all GIFs to PNGs. + * Reorganised the handling of themes, template engines, templates and styles. + * Unified and extended the available theme settings. + * Added theme screenshots. +- Blocks: + * Added 'recent comments' block. + * Added 'categories' block. +- Blogger API: + * Added support for auto-discovery of blogger API via RSD. +- Performance: + * Added support for sending gzip compressed pages. + * Improved performance of the forum module. +- Accessibility: + * Improved the accessibility of the archive module's calendar. + * Improved form handling and error reporting. + * Added HTTP redirects to prevent submitting twice when refreshing right after a form submission. +- Refactored 403 (forbidden) handling and added support for custom 403 pages. +- Documentation: + * Added PHPDoc/Doxygen comments. +- Filter system: + * Added support for using multiple input formats on the site + * Expanded the embedded PHP-code feature so it can be used everywhere + * Added support for role-dependent filtering, through input formats +- UI translation: + * Managing translations is now completely done through the administration interface + * Added support for importing/exporting gettext .po files + +Drupal 4.4.3, 2005-06-01 +------------------------ +- Fixed bugs, including a critical input validation bug. + +Drupal 4.4.2, 2004-07-04 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.4.1, 2004-05-01 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.4.0, 2004-04-01 +------------------------ +- Added support for the MetaWeblog API and MovableType extensions. +- Added a file API: enables better document management. +- Improved the watchdog and search module to log search keys. +- News aggregator: + * Added support for conditional GET. + * Added OPML feed subscription list. + * Added support for <image>, <pubDate>, <dc:date>, <dcterms:created>, <dcterms:issued> and <dcterms:modified>. +- Comment module: + * Made it possible to disable the "comment viewing controls". +- Performance: + * Improved module loading when serving cached pages. + * Made it possible to automatically disable modules when under heavy load. + * Made it possible to automatically disable blocks when under heavy load. + * Improved performance and memory footprint of the locale module. +- Theme system: + * Made all theme functions start with 'theme_'. + * Made all theme functions return their output. + * Migrated away from using the BaseTheme class. + * Added many new theme functions and refactored existing theme functions. + * Added avatar support to 'Xtemplate'. + * Replaced theme 'UnConeD' by 'Chameleon'. + * Replaced theme 'Marvin' by 'Pushbutton'. +- Usability: + * Added breadcrumb navigation to all pages. + * Made it possible to add context-sensitive help to all pages. + * Replaced drop-down menus by radio buttons where appropriate. + * Removed the 'magic_quotes_gpc = 0' requirement. + * Added a 'book navigation' block. +- Accessibility: + * Made themes degrade gracefully in absence of CSS. + * Grouped form elements using '<fieldset>' and '<legend>' tags. + * Added '<label>' tags to form elements. +- Refactored 404 (file not found) handling and added support for custom 404 pages. +- Improved the filter system to prevent conflicts between filters: + * Made it possible to change the order in which filters are applied. +- Documentation: + * Added PHPDoc/Doxygen comments. + +Drupal 4.3.2, 2004-01-01 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.3.1, 2003-12-01 +------------------------ +- Fixed bugs: no critical bugs were identified. + +Drupal 4.3.0, 2003-11-01 +------------------------ +- Added support for configurable URLs. +- Added support for sortable table columns. +- Database backend: + * Added support for selective database table prefixing. +- Performance: + * Optimized many SQL queries for speed by converting left joins to inner joins. +- Comment module: + * Rewrote the comment housekeeping code to be much more efficient and scalable. + * Changed the comment module to use the standard pager. +- User module: + * Added support for multiple sessions per user. + * Added support for anonymous user sessions. +- Forum module: + * Improved the forum views and the themability thereof. +- Book module: + * Improved integration of non-book nodes in the book outline. +- Usability: + * Added support for "mass node operations" to ease repetitive tasks. + * Added support for breadcrumb navigation to several modules' user pages. + * Integrated the administration pages with the normal user pages. + +Drupal 4.2.0, 2003-08-01 +------------------------ +- Added support for clean URLs. +- Added textarea hook and support for onload attributes: enables integration of WYSIWYG editors. +- Rewrote the RSS/RDF parser: + * It will now use PHP's built-in XML parser to parse news feeds. +- Rewrote the administration pages: + * Improved the navigational elements and added breadcrumb navigation. + * Improved the look and feel. + * Added context-sensitive help. +- Database backend: + * Fixed numerous SQL queries to make Drupal ANSI compliant. + * Added MSSQL database scheme. +- Search module: + * Changed the search module to use implicit AND'ing instead of implicit OR'ing. +- Node system: + * Replaced the "post content" permission by more fine-grained permissions. + * Improved content submission: + + Improved teasers: teasers are now optional, teaser length can be configured, teaser and body are edited in a single textarea, users will no longer be bothered with teasers when the post is too short for one. + + Added the ability to preview both the short and the full version of your posts. + * Extended the node API which allows for better integration. + * Added default node settings to control the behavior for promotion, moderation and other options. +- Themes: + * Replaced theme "Goofy" by "Xtemplate", a template driven theme. +- Removed the 'register_globals = on' requirement. +- Added better installation instructions. + +Drupal 4.1.0, 2003-02-01 +------------------------ +- Collaboratively revised and expanded the Drupal documentation. +- Rewrote comment.module: + * Reintroduced comment rating/moderation. + * Added support for comment paging. + * Performance improvements: improved comment caching, faster SQL queries, etc. +- Rewrote block.module: + * Performance improvements: blocks are no longer rendered when not displayed. +- Rewrote forum.module: + * Added a lot of features one can find in stand-alone forum software including but not limited to support for topic paging, added support for icons, rewrote the statistics module, etc. +- Rewrote statistics.module: + * Collects access counts for each node, referrer logs, number of users/guests. + * Export blocks displaying top viewed nodes over last 24 hour period, top viewed nodes over all time, last nodes viewed, how many users/guest online. +- Added throttle.module: + * Auto-throttle congestion control mechanism: Drupal can adapt itself based on the server load. +- Added profile.module: + * Enables to extend the user and registration page. +- Added pager support to the main page. +- Replaced weblogs.module by ping.module: + * Added support for normal and RSS notifications of http://blo.gs/. + * Added support for RSS ping-notifications of http://weblogs.com/. +- Removed the rating module +- Themes: + * Removed a significant portion of hard-coded mark-up. + +Drupal 4.0.0, 2002-06-15 +------------------------ +- Added tracker.module: + * Replaces the previous "your [site]" links (recent comments and nodes). +- Added weblogs.module: + * This will ping weblogs.com when new content is promoted. +- Added taxonomy module which replaces the meta module. + * Supports relations, hierarchies and synonyms. +- Added a caching system: + * Speeds up pages for anonymous users and reduces system load. +- Added support for external SMTP libraries. +- Added an archive extension to the calendar. +- Added support for the Blogger API. +- Themes: + * Cleaned up the theme system. + * Moved themes that are not maintained to contributions CVS repository. +- Database backend: + * Changed to PEAR database abstraction layer. + * Using ANSI SQL queries to be more portable. +- Rewrote the user system: + * Added support for Drupal authentication through XML-RPC and through a Jabber server. + * Added support for modules to add more user data. + * Users may delete their own account. + * Added who's new and who's online blocks. +- Changed block system: + * Various hard coded blocks are now dynamic. + * Blocks can now be enabled and/or be set by the user. + * Blocks can be set to only show up on some pages. + * Merged box module with block module. +- Node system: + * Blogs can be updated. + * Teasers (abstracts) on all node types. + * Improved error checking. + * Content versioning support. + * Usability improvements. +- Improved book module to support text, HTML and PHP pages. +- Improved comment module to mark new comments. +- Added a general outliner which will let any node type be linked to a book. +- Added an update script that lets you upgrade from previous releases or on a day to day basis when using the development tree. +- Search module: + * Improved the search system by making it context sensitive. + * Added indexing. +- Various updates: + * Changed output to valid XHTML. + * Improved multiple sites using the same Drupal database support. + * Added support for session IDs in URLs instead of cookies. + * Made the type of content on the front page configurable. + * Made each cloud site have its own settings. + * Modules and themes can now be enabled/disabled using the administration pages. + * Added URL abstraction for links. + * Usability changes (renamed links, better UI, etc). +- Collaboratively revised and expanded the Drupal documentation. + +Drupal 3.0.1, 2001-10-15 +------------------------ +- Various updates: + * Added missing translations + * Updated the themes: tidied up some HTML code and added new Drupal logos. + +Drupal 3.0.0, 2001-09-15 +------------------------ +- Major overhaul of the entire underlying design: + * Everything is based on nodes: nodes are a conceptual "black box" to couple and manage different types of content and that promotes reusing existing code, thus reducing the complexity and size of Drupal as well as improving long-term stability. +- Rewrote submission/moderation queue and renamed it to queue.module. +- Removed FAQ and documentation module and merged them into a "book module". +- Removed ban module and integrated it into account.module as "access control": + * Access control is based on much more powerful regular expressions (regex) now rather than on MySQL pattern matching. +- Rewrote watchdog and submission throttle: + * Improved watchdog messages and added watchdog filter. +- Rewrote headline code and renamed it to import.module and export.module: + * Added various improvements, including a better parser, bundles and better control over individual feeds. +- Rewrote section code and renamed it to meta.module: + * Supports unlimited amount of nested topics. Topics can be nested to create a multi-level hierarchy. +- Rewrote configuration file resolving: + * Drupal tries to locate a configuration file that matches your domain name or uses conf.php if the former failed. Note also that the configuration files got renamed from .conf to .php for security's sake on mal-configured Drupal sites. +- Added caching support which makes Drupal extremely scalable. +- Added access.module: + * Allows you to set up 'roles' (groups) and to bind a set of permissions to each group. +- Added blog.module. +- Added poll.module. +- Added system.module: + * Moved most of the configuration options from hostname.conf to the new administration section. + * Added support for custom "filters". +- Added statistics.module +- Added moderate.module: + * Allows to assign users editorial/moderator rights to certain nodes or topics. +- Added page.module: + * Allows creation of static (and dynamic) pages through the administration interface. +- Added help.module: + * Groups all available module documentation on a single page. +- Added forum.module: + * Added an integrated forum. +- Added cvs.module and cvs-to-sql.pl: + * Allows to display and mail CVS log messages as daily digests. +- Added book.module: + * Allows collaborative handbook writing: primary used for Drupal documentation. +- Removed cron.module and integrated it into conf.module. +- Removed module.module as it was no longer needed. +- Various updates: + * Added "auto-post new submissions" feature versus "moderate new submissions". + * Introduced links/Drupal tags: [[link]] + * Added preview functionality when submitting new content (such as a story) from the administration pages. + * Made the administration section only show those links a user has access to. + * Made all modules use specific form_* functions to guarantee a rock-solid forms and more consistent layout. + * Improved scheduler: + + Content can be scheduled to be 'posted', 'queued' and 'hidden'. + * Improved account module: + + Added "access control" to allow/deny certain usernames/e-mail addresses/hostnames. + * Improved locale module: + + Added new overview to easy the translation process. + * Improved comment module: + + Made it possible to permanently delete comments. + * Improved rating module + * Improved story module: + + Added preview functionality for administrators. + + Made it possible to permanently delete stories. + * Improved themes: + + W3C validation on a best effort basis. + + Removed $theme->control() from themes. + + Added theme "goofy". +- Collaboratively revised and expanded the Drupal documentation. + +Drupal 2.0.0, 2001-03-15 +------------------------ +- Rewrote the comment/discussion code: + * Comment navigation should be less confusing now. + * Additional/alternative display and order methods have been added. + * Modules can be extended with a "comment system": modules can embed the existing comment system without having to write their own, duplicate comment system. +- Added sections and section manager: + * Story sections can be maintained from the administration pages. + * Story sections make the open submission more adaptive in that you can set individual post, dump and expiration thresholds for each section according to the story type and urgency level: stories in certain sections do not "expire" and might stay interesting and active as time passes by, whereas news-related stories are only considered "hot" over a short period of time. +- Multiple vhosts + multiple directories: + * You can set up multiple Drupal sites on top of the same physical source tree either by using vhosts or sub-directories. +- Added "user ratings" similar to SlashCode's Karma or Scoop's Mojo: + * All rating logic is packed into a module to ease experimenting with different rating heuristics/algorithms. +- Added "search infrastructure": + * Improved search page and integrated search functionality in the administration pages. +- Added translation / localization / internationalization support: + * Because many people would love to see their website showing a lot less of English, and far more of their own language, Drupal provides a framework to set up a multi-lingual website or to overwrite the default English text in English. +- Added fine-grained user permission (or group) system: + * Users can be granted access to specific administration sections. Example: a FAQ maintainer can be given access to maintain the FAQ and translators can be given access to the translation pages. +- Added FAQ module +- Changed the "open submission queue" into a (optional) module. +- Various updates: + * Improved account module: + + User accounts can be deleted. + + Added fine-grained permission support. + * Improved block module + * Improved diary module: + + Diary entries can be deleted + * Improved headline module: + + Improved parser to support more "generic" RDF/RSS/XML backend. + * Improved module module + * Improved watchdog module + * Improved database abstraction layer + * Improved themes: + + W3C validation on a best effort basis + + Added theme "example" (alias "Stone Age") + * Added new scripts to directory "scripts" + * Added directory "misc" + * Added CREDITS file +- Revised documentation + +Drupal 1.0.0, 2001-01-15 +------------------------ +- Initial release diff --git a/docroot/INSTALL.mysql.txt b/docroot/INSTALL.mysql.txt new file mode 100644 index 000000000..95a873433 --- /dev/null +++ b/docroot/INSTALL.mysql.txt @@ -0,0 +1,45 @@ + +CREATE THE MySQL DATABASE +-------------------------- + +This step is only necessary if you don't already have a database set up (e.g., +by your host). In the following examples, 'username' is an example MySQL user +which has the CREATE and GRANT privileges. Use the appropriate user name for +your system. + +First, you must create a new database for your Drupal site (here, 'databasename' +is the name of the new database): + + mysqladmin -u username -p create databasename + +MySQL will prompt for the 'username' database password and then create the +initial database files. Next you must log in and set the access database rights: + + mysql -u username -p + +Again, you will be asked for the 'username' database password. At the MySQL +prompt, enter the following command: + + GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, + CREATE TEMPORARY TABLES ON databasename.* + TO 'username'@'localhost' IDENTIFIED BY 'password'; + +where: + + 'databasename' is the name of your database + 'username' is the username of your MySQL account + 'localhost' is the web server host where Drupal is installed + 'password' is the password required for that username + +Note: Unless the database user/host combination for your Drupal installation +has all of the privileges listed above (except possibly CREATE TEMPORARY TABLES, +which is currently only used by Drupal core automated tests and some +contributed modules), you will not be able to install or run Drupal. + +If successful, MySQL will reply with: + + Query OK, 0 rows affected + +If the InnoDB storage engine is available, it will be used for all database +tables. InnoDB provides features over MyISAM such as transaction support, +row-level locks, and consistent non-locking reads. diff --git a/docroot/INSTALL.pgsql.txt b/docroot/INSTALL.pgsql.txt new file mode 100644 index 000000000..8fe80433b --- /dev/null +++ b/docroot/INSTALL.pgsql.txt @@ -0,0 +1,44 @@ + +CREATE THE PostgreSQL DATABASE +------------------------------ + +Note that the database must be created with UTF-8 (Unicode) encoding. + +1. CREATE DATABASE USER + + This step is only necessary if you don't already have a user set up (e.g., by + your host), or want to create a new user for use with Drupal only. The + following command creates a new user named 'username' and asks for a password + for that user: + + createuser --pwprompt --encrypted --no-createrole --no-createdb username + + If there are no errors, then the command was successful. + +2. CREATE DRUPAL DATABASE + + This step is only necessary if you don't already have a database set up + (e.g., by your host) or want to create a new database for use with Drupal + only. The following command creates a new database named 'databasename', + which is owned by the previously created 'username': + + createdb --encoding=UTF8 --owner=username databasename + + If there are no errors, then the command was successful. + +3. CREATE SCHEMA OR SCHEMAS (Optional advanced step) + + Drupal will run across different schemas within your database if you so wish. + By default, Drupal runs inside the 'public' schema but you can use $db_prefix + inside settings.php to define a schema for Drupal to run inside of, or + specify tables that are shared inside of a separate schema. Drupal will not + create schemas for you. In fact, the user that Drupal runs as should not be + allowed to do this. You'll need to execute the SQL below as a superuser, + replace 'username' with the username that Drupal uses to connect to + PostgreSQL, and replace 'schema_name' with a schema name you wish to use, + such as 'shared': + + CREATE SCHEMA schema_name AUTHORIZATION username; + + Do this for as many schemas as you need. See default.settings.php for + instructions on how to set which tables use which schemas. diff --git a/docroot/INSTALL.sqlite.txt b/docroot/INSTALL.sqlite.txt new file mode 100644 index 000000000..8e57d60cc --- /dev/null +++ b/docroot/INSTALL.sqlite.txt @@ -0,0 +1,31 @@ + +SQLITE REQUIREMENTS +------------------- + +To use SQLite with your Drupal installation, the following requirements must be +met: Server has PHP 5.2 or later with PDO, and the PDO SQLite driver must be +enabled. + +SQLITE DATABASE CREATION +------------------------ + +The Drupal installer will create the SQLite database for you. The only +requirement is that the installer must have write permissions to the directory +where the database file resides. This directory (not just the database file) also +has to remain writeable by the web server going forward for SQLite to continue to +be able to operate. + +On the "Database configuration" form in the "Database file" field, you must +supply the exact path to where you wish your database file to reside. It is +strongly suggested that you choose a path that is outside of the webroot, yet +ensure that the directory is writeable by the web server. + +If you must place your database file in your webroot, you could try using the +following in your "Database file" field: + + sites/default/files/.ht.sqlite + +Note: The .ht in the name will tell Apache to prevent the database from being +downloaded. Please check that the file is, indeed, protected by your webserver. +If not, please consult the documentation of your webserver on how to protect a +file from downloading. diff --git a/docroot/INSTALL.txt b/docroot/INSTALL.txt new file mode 100644 index 000000000..e00c8bad3 --- /dev/null +++ b/docroot/INSTALL.txt @@ -0,0 +1,400 @@ + +CONTENTS OF THIS FILE +--------------------- + + * Requirements and notes + * Optional server requirements + * Installation + * Building and customizing your site + * Multisite configuration + * More information + +REQUIREMENTS AND NOTES +---------------------- + +Drupal requires: + +- A web server. Apache (version 2.0 or greater) is recommended. +- PHP 5.2.4 (or greater) (http://www.php.net/). +- One of the following databases: + - MySQL 5.0.15 (or greater) (http://www.mysql.com/). + - MariaDB 5.1.44 (or greater) (http://mariadb.org/). MariaDB is a fully + compatible drop-in replacement for MySQL. + - Percona Server 5.1.70 (or greater) (http://www.percona.com/). Percona + Server is a backwards-compatible replacement for MySQL. + - PostgreSQL 8.3 (or greater) (http://www.postgresql.org/). + - SQLite 3.3.7 (or greater) (http://www.sqlite.org/). + +For more detailed information about Drupal requirements, including a list of +PHP extensions and configurations that are required, see "System requirements" +(http://drupal.org/requirements) in the Drupal.org online documentation. + +For detailed information on how to configure a test server environment using a +variety of operating systems and web servers, see "Local server setup" +(http://drupal.org/node/157602) in the Drupal.org online documentation. + +Note that all directories mentioned in this document are always relative to the +directory of your Drupal installation, and commands are meant to be run from +this directory (except for the initial commands that create that directory). + +OPTIONAL SERVER REQUIREMENTS +---------------------------- + +- If you want to use Drupal's "Clean URLs" feature on an Apache web server, you + will need the mod_rewrite module and the ability to use local .htaccess + files. For Clean URLs support on IIS, see "Clean URLs with IIS" + (http://drupal.org/node/3854) in the Drupal.org online documentation. + +- If you plan to use XML-based services such as RSS aggregation, you will need + PHP's XML extension. This extension is enabled by default on most PHP + installations. + +- To serve gzip compressed CSS and JS files on an Apache web server, you will + need the mod_headers module and the ability to use local .htaccess files. + +- Some Drupal functionality (e.g., checking whether Drupal and contributed + modules need updates, RSS aggregation, etc.) require that the web server be + able to go out to the web and download information. If you want to use this + functionality, you need to verify that your hosting provider or server + configuration allows the web server to initiate outbound connections. Most web + hosting setups allow this. + +INSTALLATION +------------ + +1. Download and extract Drupal. + + You can obtain the latest Drupal release from http://drupal.org -- the files + are available in .tar.gz and .zip formats and can be extracted using most + compression tools. + + To download and extract the files, on a typical Unix/Linux command line, use + the following commands (assuming you want version x.y of Drupal in .tar.gz + format): + + wget http://drupal.org/files/projects/drupal-x.y.tar.gz + tar -zxvf drupal-x.y.tar.gz + + This will create a new directory drupal-x.y/ containing all Drupal files and + directories. Then, to move the contents of that directory into a directory + within your web server's document root or your public HTML directory, + continue with this command: + + mv drupal-x.y/* drupal-x.y/.htaccess /path/to/your/installation + +2. Optionally, download a translation. + + By default, Drupal is installed in English, and further languages may be + installed later. If you prefer to install Drupal in another language + initially: + + - Download a translation file for the correct Drupal version and language + from the translation server: http://localize.drupal.org/translate/downloads + + - Place the file into your installation profile's translations directory. + For instance, if you are using the Standard installation profile, + move the .po file into the directory: + + profiles/standard/translations/ + + For detailed instructions, visit http://drupal.org/localize + +3. Create the Drupal database. + + Because Drupal stores all site information in a database, you must create + this database in order to install Drupal, and grant Drupal certain database + privileges (such as the ability to create tables). For details, consult + INSTALL.mysql.txt, INSTALL.pgsql.txt, or INSTALL.sqlite.txt. You may also + need to consult your web hosting provider for instructions specific to your + web host. + + Take note of the username, password, database name, and hostname as you + create the database. You will enter this information during the install. + +4. Run the install script. + + To run the install script, point your browser to the base URL of your + website (e.g., http://www.example.com). + + You will be guided through several screens to set up the database, add the + site maintenance account (the first user, also known as user/1), and provide + basic web site settings. + + During installation, several files and directories need to be created, which + the install script will try to do automatically. However, on some hosting + environments, manual steps are required, and the install script will tell + you that it cannot proceed until you fix certain issues. This is normal and + does not indicate a problem with your server. + + The most common steps you may need to perform are: + + a. Missing files directory. + + The install script will attempt to create a file storage directory in + the default location at sites/default/files (the location of the files + directory may be changed after Drupal is installed). + + If auto-creation fails, you can make it work by changing permissions on + the sites/default directory so that the web server can create the files + directory within it for you. (If you are creating a multisite + installation, substitute the correct sites directory for sites/default; + see the Multisite Configuration section of this file, below.) + + For example, on a Unix/Linux command line, you can grant everyone + (including the web server) permission to write to the sites/default + directory with this command: + + chmod a+w sites/default + + Be sure to set the permissions back after the installation is finished! + Sample command: + + chmod go-w sites/default + + Alternatively, instead of allowing the web server to create the files + directory for you as described above, you can create it yourself. Sample + commands from a Unix/Linux command line: + + mkdir sites/default/files + chmod a+w sites/default/files + + b. Missing settings file. + + Drupal will try to automatically create a settings.php configuration file, + which is normally in the directory sites/default (to avoid problems when + upgrading, Drupal is not packaged with this file). If auto-creation fails, + you will need to create this file yourself, using the file + sites/default/default.settings.php as a template. + + For example, on a Unix/Linux command line, you can make a copy of the + default.settings.php file with the command: + + cp sites/default/default.settings.php sites/default/settings.php + + Next, grant write privileges to the file to everyone (including the web + server) with the command: + + chmod a+w sites/default/settings.php + + Be sure to set the permissions back after the installation is finished! + Sample command: + + chmod go-w sites/default/settings.php + + c. Write permissions after install. + + The install script will attempt to write-protect the settings.php file and + the sites/default directory after saving your configuration. If this + fails, you will be notified, and you can do it manually. Sample commands + from a Unix/Linux command line: + + chmod go-w sites/default/settings.php + chmod go-w sites/default + +5. Verify that the site is working. + + When the install script finishes, you will be logged in with the site + maintenance account on a "Welcome" page. If the default Drupal theme is not + displaying properly and links on the page result in "Page Not Found" errors, + you may be experiencing problems with clean URLs. Visit + http://drupal.org/getting-started/clean-urls to troubleshoot. + +6. Change file system storage settings (optional). + + The files directory created in step 4 is the default file system path used to + store all uploaded files, as well as some temporary files created by + Drupal. After installation, you can modify the file system path to store + uploaded files in a different location. + + It is not necessary to modify this path, but you may wish to change it if: + + - Your site runs multiple Drupal installations from a single codebase (modify + the file system path of each installation to a different directory so that + uploads do not overlap between installations). + + - Your site runs on a number of web servers behind a load balancer or reverse + proxy (modify the file system path on each server to point to a shared file + repository). + + - You want to restrict access to uploaded files. + + To modify the file system path: + + a. Ensure that the new location for the path exists and is writable by the + web server. For example, to create a new directory named uploads and grant + write permissions, use the following commands on a Unix/Linux command + line: + + mkdir uploads + chmod a+w uploads + + b. Navigate to Administration > Configuration > Media > File system, and + enter the desired path. Note that if you want to use private file storage, + you need to first enter the path for private files and save the + configuration, and then change the "Default download method" setting and + save again. + + Changing the file system path after files have been uploaded may cause + unexpected problems on an existing site. If you modify the file system path + on an existing site, remember to copy all files from the original location + to the new location. + +7. Revoke documentation file permissions (optional). + + Some administrators suggest making the documentation files, especially + CHANGELOG.txt, non-readable so that the exact version of Drupal you are + running is slightly more difficult to determine. If you wish to implement + this optional security measure, from a Unix/Linux command line you can use + the following command: + + chmod a-r CHANGELOG.txt + + Note that the example only affects CHANGELOG.txt. To completely hide all + documentation files from public view, repeat this command for each of the + Drupal documentation files in the installation directory, substituting the + name of each file for CHANGELOG.txt in the example. + + For more information on setting file permissions, see "Modifying Linux, + Unix, and Mac file permissions" (http://drupal.org/node/202483) or + "Modifying Windows file permissions" (http://drupal.org/node/202491) in the + Drupal.org online documentation. + +8. Set up independent "cron" maintenance jobs. + + Many Drupal modules have tasks that must be run periodically, including the + Search module (building and updating the index used for keyword searching), + the Aggregator module (retrieving feeds from other sites), and the System + module (performing routine maintenance and pruning of database tables). These + tasks are known as "cron maintenance tasks", named after the Unix/Linux + "cron" utility. + + When you install Drupal, its built-in cron feature is enabled, which + automatically runs the cron tasks periodically, triggered by people visiting + pages of your site. You can configure the built-in cron feature by navigating + to Administration > Configuration > System > Cron. + + It is also possible to run the cron tasks independent of site visits; this is + recommended for most sites. To do this, you will need to set up an automated + process to visit the page cron.php on your site, which executes the cron + tasks. + + The URL of the cron.php page requires a "cron key" to protect against + unauthorized access. Your site's cron key is automatically generated during + installation and is specific to your site. The full URL of the page, with the + cron key, is available in the "Cron maintenance tasks" section of the Status + report page at Administration > Reports > Status report. + + As an example for how to set up this automated process, you can use the + crontab utility on Unix/Linux systems. The following crontab line uses the + wget command to visit the cron.php page, and runs each hour, on the hour: + + 0 * * * * wget -O - -q -t 1 http://example.com/cron.php?cron_key=YOURKEY + + Replace the text "http://example.com/cron.php?cron_key=YOURKEY" in the + example with the full URL displayed under "Cron maintenance tasks" on the + "Status report" page. + + More information about cron maintenance tasks is available at + http://drupal.org/cron, and sample cron shell scripts can be found in the + scripts/ directory. (Note that these scripts must be customized like the + above example, to add your site-specific cron key and domain name.) + +BUILDING AND CUSTOMIZING YOUR SITE +---------------------------------- + +A new installation of Drupal defaults to a very basic configuration. To extend +your site, you use "modules" and "themes". A module is a plugin that adds +functionality to Drupal, while a theme changes the look of your site. The core +of Drupal provides several optional modules and themes, and you can download +more at http://drupal.org/project/modules and http://drupal.org/project/themes + +Do not mix downloaded or custom modules and themes with Drupal's core modules +and themes. Drupal's modules and themes are located in the top-level modules and +themes directories, while the modules and themes you add to Drupal are normally +placed in the sites/all/modules and sites/all/themes directories. If you run a +multisite installation, you can also place modules and themes in the +site-specific directories -- see the Multisite Configuration section, below. + +Never edit Drupal's core modules and themes; instead, use the hooks available in +the Drupal API. To modify the behavior of Drupal, develop a module as described +at http://drupal.org/developing/modules. To modify the look of Drupal, create a +subtheme as described at http://drupal.org/node/225125, or a completely new +theme as described at http://drupal.org/documentation/theme + +MULTISITE CONFIGURATION +----------------------- + +A single Drupal installation can host several Drupal-powered sites, each with +its own individual configuration. + +Additional site configurations are created in subdirectories within the 'sites' +directory. Each subdirectory must have a 'settings.php' file, which specifies +the configuration settings. The easiest way to create additional sites is to +copy the 'default' directory and modify the 'settings.php' file as appropriate. +The new directory name is constructed from the site's URL. The configuration for +www.example.com could be in 'sites/example.com/settings.php' (note that 'www.' +should be omitted if users can access your site at http://example.com/). + +Sites do not have to have a different domain. You can also use subdomains and +subdirectories for Drupal sites. For example, example.com, sub.example.com, and +sub.example.com/site3 can all be defined as independent Drupal sites. The setup +for a configuration such as this would look like the following: + + sites/default/settings.php + sites/example.com/settings.php + sites/sub.example.com/settings.php + sites/sub.example.com.site3/settings.php + +When searching for a site configuration (for example www.sub.example.com/site3), +Drupal will search for configuration files in the following order, using the +first configuration it finds: + + sites/www.sub.example.com.site3/settings.php + sites/sub.example.com.site3/settings.php + sites/example.com.site3/settings.php + sites/www.sub.example.com/settings.php + sites/sub.example.com/settings.php + sites/example.com/settings.php + sites/default/settings.php + +If you are installing on a non-standard port, the port number is treated as the +deepest subdomain. For example: http://www.example.com:8080/ could be loaded +from sites/8080.www.example.com/. The port number will be removed according to +the pattern above if no port-specific configuration is found, just like a real +subdomain. + +Each site configuration can have its own site-specific modules and themes in +addition to those installed in the standard 'modules' and 'themes' directories. +To use site-specific modules or themes, simply create a 'modules' or 'themes' +directory within the site configuration directory. For example, if +sub.example.com has a custom theme and a custom module that should not be +accessible to other sites, the setup would look like this: + + sites/sub.example.com/ + settings.php + themes/custom_theme + modules/custom_module + +NOTE: for more information about multiple virtual hosts or the configuration +settings, consult http://drupal.org/getting-started/6/install/multi-site + +For more information on configuring Drupal's file system path in a multisite +configuration, see step 6 above. + +MORE INFORMATION +---------------- + +- See the Drupal.org online documentation: + http://drupal.org/documentation + +- For a list of security announcements, see the "Security advisories" page at + http://drupal.org/security (available as an RSS feed). This page also + describes how to subscribe to these announcements via e-mail. + +- For information about the Drupal security process, or to find out how to + report a potential security issue to the Drupal security team, see the + "Security team" page at http://drupal.org/security-team + +- For information about the wide range of available support options, visit + http://drupal.org and click on Community and Support in the top or bottom + navigation. diff --git a/docroot/PATCHES.txt b/docroot/PATCHES.txt index 10122c491..cee05d667 100644 --- a/docroot/PATCHES.txt +++ b/docroot/PATCHES.txt @@ -1,5 +1,5 @@ The following patches have been applied to this project: -- http://drupal.org/files/issues/995156-5_portable_taxonomy_permissions.patch +- https://drupal.org/files/issues/995156-5_portable_taxonomy_permissions.patch - https://www.drupal.org/files/issues/drupal-undefinedindex_fileupload-1903010-4.patch - https://www.drupal.org/files/issues/file.remote-file_save.628094.22.patch - https://www.drupal.org/files/issues/drupal_bug_multiple_values_select_states.patch diff --git a/docroot/README.txt b/docroot/README.txt new file mode 100644 index 000000000..60d3da592 --- /dev/null +++ b/docroot/README.txt @@ -0,0 +1,123 @@ + +CONTENTS OF THIS FILE +--------------------- + + * About Drupal + * Configuration and features + * Installation profiles + * Appearance + * Developing for Drupal + +ABOUT DRUPAL +------------ + +Drupal is an open source content management platform supporting a variety of +websites ranging from personal weblogs to large community-driven websites. For +more information, see the Drupal website at http://drupal.org/, and join the +Drupal community at http://drupal.org/community. + +Legal information about Drupal: + * Know your rights when using Drupal: + See LICENSE.txt in the same directory as this document. + * Learn about the Drupal trademark and logo policy: + http://drupal.com/trademark + +CONFIGURATION AND FEATURES +-------------------------- + +Drupal core (what you get when you download and extract a drupal-x.y.tar.gz or +drupal-x.y.zip file from http://drupal.org/project/drupal) has what you need to +get started with your website. It includes several modules (extensions that add +functionality) for common website features, such as managing content, user +accounts, image uploading, and search. Core comes with many options that allow +site-specific configuration. In addition to the core modules, there are +thousands of contributed modules (for functionality not included with Drupal +core) available for download. + +More about configuration: + * Install, upgrade, and maintain Drupal: + See INSTALL.txt and UPGRADE.txt in the same directory as this document. + * Learn about how to use Drupal to create your site: + http://drupal.org/documentation + * Download contributed modules to sites/all/modules to extend Drupal's + functionality: + http://drupal.org/project/modules + * See also: "Developing for Drupal" for writing your own modules, below. + +INSTALLATION PROFILES +--------------------- + +Installation profiles define additional steps (such as enabling modules, +defining content types, etc.) that run after the base installation provided +by core when Drupal is first installed. There are two basic installation +profiles provided with Drupal core. + +Installation profiles from the Drupal community modify the installation process +to provide a website for a specific use case, such as a CMS for media +publishers, a web-based project tracking tool, or a full-fledged CRM for +non-profit organizations raising money and accepting donations. They can be +distributed as bare installation profiles or as "distributions". Distributions +include Drupal core, the installation profile, and all other required +extensions, such as contributed and custom modules, themes, and third-party +libraries. Bare installation profiles require you to download Drupal Core and +the required extensions separately; place the downloaded profile in the +/profiles directory before you start the installation process. Note that the +contents of this directory may be overwritten during updates of Drupal core; +it is advised to keep code backups or use a version control system. + +Additionally, modules and themes may be placed inside subdirectories in a +specific installation profile such as profiles/your_site_profile/modules and +profiles/your_site_profile/themes respectively to restrict their usage to only +sites that were installed with that specific profile. + +More about installation profiles and distributions: + * Read about the difference between installation profiles and distributions: + http://drupal.org/node/1089736 + * Download contributed installation profiles and distributions: + http://drupal.org/project/distributions + * Develop your own installation profile or distribution: + http://drupal.org/developing/distributions + +APPEARANCE +---------- + +In Drupal, the appearance of your site is set by the theme (themes are +extensions that set fonts, colors, and layout). Drupal core comes with several +themes. More themes are available for download, and you can also create your own +custom theme. + +More about themes: + * Download contributed themes to sites/all/themes to modify Drupal's + appearance: + http://drupal.org/project/themes + * Develop your own theme: + http://drupal.org/documentation/theme + +DEVELOPING FOR DRUPAL +--------------------- + +Drupal contains an extensive API that allows you to add to and modify the +functionality of your site. The API consists of "hooks", which allow modules to +react to system events and customize Drupal's behavior, and functions that +standardize common operations such as database queries and form generation. The +flexible hook architecture means that you should never need to directly modify +the files that come with Drupal core to achieve the functionality you want; +instead, functionality modifications take the form of modules. + +When you need new functionality for your Drupal site, search for existing +contributed modules. If you find a module that matches except for a bug or an +additional needed feature, change the module and contribute your improvements +back to the project in the form of a "patch". Create new custom modules only +when nothing existing comes close to what you need. + +More about developing: + * Search for existing contributed modules: + http://drupal.org/project/modules + * Contribute a patch: + http://drupal.org/patch/submit + * Develop your own module: + http://drupal.org/developing/modules + * Follow best practices: + http://drupal.org/best-practices + * Refer to the API documentation: + http://api.drupal.org/api/drupal/7 diff --git a/docroot/includes/bootstrap.inc b/docroot/includes/bootstrap.inc index 06acf935e..a91c398f4 100644 --- a/docroot/includes/bootstrap.inc +++ b/docroot/includes/bootstrap.inc @@ -8,7 +8,7 @@ /** * The current system version. */ -define('VERSION', '7.58'); +define('VERSION', '7.59'); /** * Core API compatibility. @@ -2778,6 +2778,11 @@ function _drupal_bootstrap_variables() { unset($_GET['destination']); unset($_REQUEST['destination']); } + // Use the DrupalRequestSanitizer to ensure that the destination's query + // parameters are not dangerous. + if (isset($_GET['destination'])) { + DrupalRequestSanitizer::cleanDestination(); + } // If there's still something in $_REQUEST['destination'] that didn't come // from $_GET, check it too. if (isset($_REQUEST['destination']) && (!isset($_GET['destination']) || $_REQUEST['destination'] != $_GET['destination']) && url_is_external($_REQUEST['destination'])) { diff --git a/docroot/includes/common.inc b/docroot/includes/common.inc index d7dc47f22..f61d1eb0f 100644 --- a/docroot/includes/common.inc +++ b/docroot/includes/common.inc @@ -611,8 +611,9 @@ function drupal_parse_url($url) { } // The 'q' parameter contains the path of the current page if clean URLs are // disabled. It overrides the 'path' of the URL when present, even if clean - // URLs are enabled, due to how Apache rewriting rules work. - if (isset($options['query']['q'])) { + // URLs are enabled, due to how Apache rewriting rules work. The path + // parameter must be a string. + if (isset($options['query']['q']) && is_string($options['query']['q'])) { $options['path'] = $options['query']['q']; unset($options['query']['q']); } diff --git a/docroot/includes/request-sanitizer.inc b/docroot/includes/request-sanitizer.inc index 1daa6b534..7214436b8 100644 --- a/docroot/includes/request-sanitizer.inc +++ b/docroot/includes/request-sanitizer.inc @@ -51,6 +51,38 @@ class DrupalRequestSanitizer { } } + /** + * Removes the destination if it is dangerous. + * + * Note this can only be called after common.inc has been included. + * + * @return bool + * TRUE if the destination has been removed from $_GET, FALSE if not. + */ + public static function cleanDestination() { + $dangerous_keys = array(); + $log_sanitized_keys = variable_get('sanitize_input_logging', FALSE); + + $parts = drupal_parse_url($_GET['destination']); + // If there is a query string, check its query parameters. + if (!empty($parts['query'])) { + $whitelist = variable_get('sanitize_input_whitelist', array()); + + self::stripDangerousValues($parts['query'], $whitelist, $dangerous_keys); + if (!empty($dangerous_keys)) { + // The destination is removed rather than sanitized to mirror the + // handling of external destinations. + unset($_GET['destination']); + unset($_REQUEST['destination']); + if ($log_sanitized_keys) { + trigger_error(format_string('Potentially unsafe destination removed from query string parameters (GET) because it contained the following keys: @keys', array('@keys' => implode(', ', $dangerous_keys)))); + } + return TRUE; + } + } + return FALSE; + } + /** * Strips dangerous keys from the provided input. * diff --git a/docroot/modules/README.txt b/docroot/modules/README.txt new file mode 100644 index 000000000..8928d8021 --- /dev/null +++ b/docroot/modules/README.txt @@ -0,0 +1,9 @@ + +This directory is reserved for core module files. Custom or contributed modules +should be placed in their own subdirectory of the sites/all/modules directory. +For multisite installations, they can also be placed in a subdirectory under +/sites/{sitename}/modules/, where {sitename} is the name of your site (e.g., +www.example.com). This will allow you to more easily update Drupal core files. + +For more details, see: http://drupal.org/node/176043 + diff --git a/docroot/modules/aggregator/aggregator.info b/docroot/modules/aggregator/aggregator.info index e8645d1f7..18821d299 100644 --- a/docroot/modules/aggregator/aggregator.info +++ b/docroot/modules/aggregator/aggregator.info @@ -7,8 +7,7 @@ files[] = aggregator.test configure = admin/config/services/aggregator/settings stylesheets[all][] = aggregator.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/aggregator/tests/aggregator_test.info b/docroot/modules/aggregator/tests/aggregator_test.info index e6d5a0a73..d0d7f09f8 100644 --- a/docroot/modules/aggregator/tests/aggregator_test.info +++ b/docroot/modules/aggregator/tests/aggregator_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/block/block.info b/docroot/modules/block/block.info index 934bfdea9..c65e02322 100644 --- a/docroot/modules/block/block.info +++ b/docroot/modules/block/block.info @@ -6,8 +6,7 @@ core = 7.x files[] = block.test configure = admin/structure/block -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/block/tests/block_test.info b/docroot/modules/block/tests/block_test.info index d7e222034..04d117ba4 100644 --- a/docroot/modules/block/tests/block_test.info +++ b/docroot/modules/block/tests/block_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/block/tests/themes/block_test_theme/block_test_theme.info b/docroot/modules/block/tests/themes/block_test_theme/block_test_theme.info index 31b438243..f1983a4b8 100644 --- a/docroot/modules/block/tests/themes/block_test_theme/block_test_theme.info +++ b/docroot/modules/block/tests/themes/block_test_theme/block_test_theme.info @@ -13,8 +13,7 @@ regions[footer] = Footer regions[highlighted] = Highlighted regions[help] = Help -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/blog/blog.info b/docroot/modules/blog/blog.info index 84ad946d7..ba12e290a 100644 --- a/docroot/modules/blog/blog.info +++ b/docroot/modules/blog/blog.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = blog.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/book/book.info b/docroot/modules/book/book.info index 53e454bfb..b24136695 100644 --- a/docroot/modules/book/book.info +++ b/docroot/modules/book/book.info @@ -7,8 +7,7 @@ files[] = book.test configure = admin/content/book/settings stylesheets[all][] = book.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/color/color.info b/docroot/modules/color/color.info index 0d17ce116..f3c14eadc 100644 --- a/docroot/modules/color/color.info +++ b/docroot/modules/color/color.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = color.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/comment/comment.info b/docroot/modules/comment/comment.info index 5d5abbf46..d00d4675e 100644 --- a/docroot/modules/comment/comment.info +++ b/docroot/modules/comment/comment.info @@ -9,8 +9,7 @@ files[] = comment.test configure = admin/content/comment stylesheets[all][] = comment.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/contact/contact.info b/docroot/modules/contact/contact.info index b365daf96..99232a9d3 100644 --- a/docroot/modules/contact/contact.info +++ b/docroot/modules/contact/contact.info @@ -6,8 +6,7 @@ core = 7.x files[] = contact.test configure = admin/structure/contact -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/contextual/contextual.info b/docroot/modules/contextual/contextual.info index ba47a4cb8..e7f7218fe 100644 --- a/docroot/modules/contextual/contextual.info +++ b/docroot/modules/contextual/contextual.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = contextual.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/dashboard/dashboard.info b/docroot/modules/dashboard/dashboard.info index d6e986601..f83f5f87f 100644 --- a/docroot/modules/dashboard/dashboard.info +++ b/docroot/modules/dashboard/dashboard.info @@ -7,8 +7,7 @@ files[] = dashboard.test dependencies[] = block configure = admin/dashboard/customize -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/dblog/dblog.info b/docroot/modules/dblog/dblog.info index cb85f8114..5c9084374 100644 --- a/docroot/modules/dblog/dblog.info +++ b/docroot/modules/dblog/dblog.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = dblog.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/field.info b/docroot/modules/field/field.info index e05108eca..93d560ae1 100644 --- a/docroot/modules/field/field.info +++ b/docroot/modules/field/field.info @@ -11,8 +11,7 @@ dependencies[] = field_sql_storage required = TRUE stylesheets[all][] = theme/field.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/modules/field_sql_storage/field_sql_storage.info b/docroot/modules/field/modules/field_sql_storage/field_sql_storage.info index 054346137..d7e27be42 100644 --- a/docroot/modules/field/modules/field_sql_storage/field_sql_storage.info +++ b/docroot/modules/field/modules/field_sql_storage/field_sql_storage.info @@ -7,8 +7,7 @@ dependencies[] = field files[] = field_sql_storage.test required = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/modules/list/list.info b/docroot/modules/field/modules/list/list.info index bef7e4a26..1f2b7874d 100644 --- a/docroot/modules/field/modules/list/list.info +++ b/docroot/modules/field/modules/list/list.info @@ -7,8 +7,7 @@ dependencies[] = field dependencies[] = options files[] = tests/list.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/modules/list/tests/list_test.info b/docroot/modules/field/modules/list/tests/list_test.info index 2d4d6ccea..561bd87e1 100644 --- a/docroot/modules/field/modules/list/tests/list_test.info +++ b/docroot/modules/field/modules/list/tests/list_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/modules/number/number.info b/docroot/modules/field/modules/number/number.info index c65d94ae5..6bd079c9b 100644 --- a/docroot/modules/field/modules/number/number.info +++ b/docroot/modules/field/modules/number/number.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = number.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/modules/options/options.info b/docroot/modules/field/modules/options/options.info index 632ca24f2..add868eee 100644 --- a/docroot/modules/field/modules/options/options.info +++ b/docroot/modules/field/modules/options/options.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = options.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/modules/text/text.info b/docroot/modules/field/modules/text/text.info index fe93a35a5..22f2eff09 100644 --- a/docroot/modules/field/modules/text/text.info +++ b/docroot/modules/field/modules/text/text.info @@ -7,8 +7,7 @@ dependencies[] = field files[] = text.test required = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field/tests/field_test.info b/docroot/modules/field/tests/field_test.info index ce3c7251e..f37ab1bb6 100644 --- a/docroot/modules/field/tests/field_test.info +++ b/docroot/modules/field/tests/field_test.info @@ -6,8 +6,7 @@ files[] = field_test.entity.inc version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/field_ui/field_ui.info b/docroot/modules/field_ui/field_ui.info index a415ae99b..77ada251c 100644 --- a/docroot/modules/field_ui/field_ui.info +++ b/docroot/modules/field_ui/field_ui.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = field_ui.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/file/file.info b/docroot/modules/file/file.info index 7269b4add..6717d6664 100644 --- a/docroot/modules/file/file.info +++ b/docroot/modules/file/file.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = tests/file.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/file/file.module b/docroot/modules/file/file.module index 22e6d385f..daf9dad71 100644 --- a/docroot/modules/file/file.module +++ b/docroot/modules/file/file.module @@ -239,6 +239,9 @@ function file_ajax_upload() { $form_parents = func_get_args(); $form_build_id = (string) array_pop($form_parents); + // Sanitize form parents before using them. + $form_parents = array_filter($form_parents, 'element_child'); + if (empty($_POST['form_build_id']) || $form_build_id != $_POST['form_build_id']) { // Invalid request. drupal_set_message(t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', array('@size' => format_size(file_upload_max_size()))), 'error'); diff --git a/docroot/modules/file/tests/file_module_test.info b/docroot/modules/file/tests/file_module_test.info index 958bf6605..e34177963 100644 --- a/docroot/modules/file/tests/file_module_test.info +++ b/docroot/modules/file/tests/file_module_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/filter/filter.info b/docroot/modules/filter/filter.info index 4a46c85c7..c96213e68 100644 --- a/docroot/modules/filter/filter.info +++ b/docroot/modules/filter/filter.info @@ -7,8 +7,7 @@ files[] = filter.test required = TRUE configure = admin/config/content/formats -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/forum/forum.info b/docroot/modules/forum/forum.info index d5b1c769b..1d7470239 100644 --- a/docroot/modules/forum/forum.info +++ b/docroot/modules/forum/forum.info @@ -9,8 +9,7 @@ files[] = forum.test configure = admin/structure/forum stylesheets[all][] = forum.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/help/help.info b/docroot/modules/help/help.info index 2c851ea94..86a154f25 100644 --- a/docroot/modules/help/help.info +++ b/docroot/modules/help/help.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = help.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/image/image.info b/docroot/modules/image/image.info index dd1200c61..d6190e319 100644 --- a/docroot/modules/image/image.info +++ b/docroot/modules/image/image.info @@ -7,8 +7,7 @@ dependencies[] = file files[] = image.test configure = admin/config/media/image-styles -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/image/tests/image_module_test.info b/docroot/modules/image/tests/image_module_test.info index c6b3a6ab3..5182a091c 100644 --- a/docroot/modules/image/tests/image_module_test.info +++ b/docroot/modules/image/tests/image_module_test.info @@ -6,8 +6,7 @@ core = 7.x files[] = image_module_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/locale/locale.info b/docroot/modules/locale/locale.info index 674d1f566..8a7c1da53 100644 --- a/docroot/modules/locale/locale.info +++ b/docroot/modules/locale/locale.info @@ -6,8 +6,7 @@ core = 7.x files[] = locale.test configure = admin/config/regional/language -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/locale/tests/locale_test.info b/docroot/modules/locale/tests/locale_test.info index 49da5e51f..76a18f7db 100644 --- a/docroot/modules/locale/tests/locale_test.info +++ b/docroot/modules/locale/tests/locale_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/menu/menu.info b/docroot/modules/menu/menu.info index 9b7ef57b1..26163eed5 100644 --- a/docroot/modules/menu/menu.info +++ b/docroot/modules/menu/menu.info @@ -6,8 +6,7 @@ core = 7.x files[] = menu.test configure = admin/structure/menu -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/node/node.info b/docroot/modules/node/node.info index 11ae2cd38..778e11b95 100644 --- a/docroot/modules/node/node.info +++ b/docroot/modules/node/node.info @@ -9,8 +9,7 @@ required = TRUE configure = admin/structure/types stylesheets[all][] = node.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/node/tests/node_access_test.info b/docroot/modules/node/tests/node_access_test.info index 007929013..4f6966cca 100644 --- a/docroot/modules/node/tests/node_access_test.info +++ b/docroot/modules/node/tests/node_access_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/node/tests/node_test.info b/docroot/modules/node/tests/node_test.info index f56e2e514..a36f6c738 100644 --- a/docroot/modules/node/tests/node_test.info +++ b/docroot/modules/node/tests/node_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/node/tests/node_test_exception.info b/docroot/modules/node/tests/node_test_exception.info index a4c118590..a0aac9099 100644 --- a/docroot/modules/node/tests/node_test_exception.info +++ b/docroot/modules/node/tests/node_test_exception.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/openid/openid.info b/docroot/modules/openid/openid.info index 69d266321..85714e105 100644 --- a/docroot/modules/openid/openid.info +++ b/docroot/modules/openid/openid.info @@ -5,8 +5,7 @@ package = Core core = 7.x files[] = openid.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/openid/tests/openid_test.info b/docroot/modules/openid/tests/openid_test.info index 7186198b6..9cdea741c 100644 --- a/docroot/modules/openid/tests/openid_test.info +++ b/docroot/modules/openid/tests/openid_test.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = openid hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/overlay/overlay.info b/docroot/modules/overlay/overlay.info index 1bf7e9ef4..dd760b754 100644 --- a/docroot/modules/overlay/overlay.info +++ b/docroot/modules/overlay/overlay.info @@ -4,8 +4,7 @@ package = Core version = VERSION core = 7.x -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/path/path.info b/docroot/modules/path/path.info index b5b0eb9b8..404b8eefd 100644 --- a/docroot/modules/path/path.info +++ b/docroot/modules/path/path.info @@ -6,8 +6,7 @@ core = 7.x files[] = path.test configure = admin/config/search/path -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/php/php.info b/docroot/modules/php/php.info index 236f9310a..9d211b05f 100644 --- a/docroot/modules/php/php.info +++ b/docroot/modules/php/php.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = php.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/poll/poll.info b/docroot/modules/poll/poll.info index eeed31d5e..2b4f19977 100644 --- a/docroot/modules/poll/poll.info +++ b/docroot/modules/poll/poll.info @@ -6,8 +6,7 @@ core = 7.x files[] = poll.test stylesheets[all][] = poll.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/profile/profile.info b/docroot/modules/profile/profile.info index 1480c618a..ef52e3adb 100644 --- a/docroot/modules/profile/profile.info +++ b/docroot/modules/profile/profile.info @@ -11,8 +11,7 @@ configure = admin/config/people/profile ; See user_system_info_alter(). hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/rdf/rdf.info b/docroot/modules/rdf/rdf.info index 18e62970d..59644867f 100644 --- a/docroot/modules/rdf/rdf.info +++ b/docroot/modules/rdf/rdf.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = rdf.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/rdf/tests/rdf_test.info b/docroot/modules/rdf/tests/rdf_test.info index a302a7b5c..df9e8293c 100644 --- a/docroot/modules/rdf/tests/rdf_test.info +++ b/docroot/modules/rdf/tests/rdf_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = blog -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/search/search.info b/docroot/modules/search/search.info index 248f476cf..87336e572 100644 --- a/docroot/modules/search/search.info +++ b/docroot/modules/search/search.info @@ -8,8 +8,7 @@ files[] = search.test configure = admin/config/search/settings stylesheets[all][] = search.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/search/tests/search_embedded_form.info b/docroot/modules/search/tests/search_embedded_form.info index 7e1b73677..d037a822e 100644 --- a/docroot/modules/search/tests/search_embedded_form.info +++ b/docroot/modules/search/tests/search_embedded_form.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/search/tests/search_extra_type.info b/docroot/modules/search/tests/search_extra_type.info index 534edade7..cc8f2bf0d 100644 --- a/docroot/modules/search/tests/search_extra_type.info +++ b/docroot/modules/search/tests/search_extra_type.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/search/tests/search_node_tags.info b/docroot/modules/search/tests/search_node_tags.info index 164389845..b3964b386 100644 --- a/docroot/modules/search/tests/search_node_tags.info +++ b/docroot/modules/search/tests/search_node_tags.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/shortcut/shortcut.info b/docroot/modules/shortcut/shortcut.info index c490374e3..cfe7f4a91 100644 --- a/docroot/modules/shortcut/shortcut.info +++ b/docroot/modules/shortcut/shortcut.info @@ -6,8 +6,7 @@ core = 7.x files[] = shortcut.test configure = admin/config/user-interface/shortcut -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/files/README.txt b/docroot/modules/simpletest/files/README.txt new file mode 100644 index 000000000..680e7feab --- /dev/null +++ b/docroot/modules/simpletest/files/README.txt @@ -0,0 +1,4 @@ +These files are useful in tests that upload files or otherwise need to +manipulate files, in which case they are copied to the files directory as +specified in the site settings. Dummy files can also be generated by tests in +order to save space. diff --git a/docroot/modules/simpletest/simpletest.info b/docroot/modules/simpletest/simpletest.info index 26b3485aa..67234c521 100644 --- a/docroot/modules/simpletest/simpletest.info +++ b/docroot/modules/simpletest/simpletest.info @@ -57,8 +57,7 @@ files[] = tests/upgrade/update.trigger.test files[] = tests/upgrade/update.field.test files[] = tests/upgrade/update.user.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/actions_loop_test.info b/docroot/modules/simpletest/tests/actions_loop_test.info index 2edf253d7..cc0cf5315 100644 --- a/docroot/modules/simpletest/tests/actions_loop_test.info +++ b/docroot/modules/simpletest/tests/actions_loop_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/ajax_forms_test.info b/docroot/modules/simpletest/tests/ajax_forms_test.info index 9736647ef..574b8825b 100644 --- a/docroot/modules/simpletest/tests/ajax_forms_test.info +++ b/docroot/modules/simpletest/tests/ajax_forms_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/ajax_test.info b/docroot/modules/simpletest/tests/ajax_test.info index fe2f90b01..8b6d24e6f 100644 --- a/docroot/modules/simpletest/tests/ajax_test.info +++ b/docroot/modules/simpletest/tests/ajax_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/batch_test.info b/docroot/modules/simpletest/tests/batch_test.info index a53e2159e..b09033074 100644 --- a/docroot/modules/simpletest/tests/batch_test.info +++ b/docroot/modules/simpletest/tests/batch_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/boot_test_1.info b/docroot/modules/simpletest/tests/boot_test_1.info index 873825dae..ec2a28a55 100644 --- a/docroot/modules/simpletest/tests/boot_test_1.info +++ b/docroot/modules/simpletest/tests/boot_test_1.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/boot_test_2.info b/docroot/modules/simpletest/tests/boot_test_2.info index e8529ba9f..b944fef87 100644 --- a/docroot/modules/simpletest/tests/boot_test_2.info +++ b/docroot/modules/simpletest/tests/boot_test_2.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/common_test.info b/docroot/modules/simpletest/tests/common_test.info index 8c56f80c3..c4ae99c2b 100644 --- a/docroot/modules/simpletest/tests/common_test.info +++ b/docroot/modules/simpletest/tests/common_test.info @@ -7,8 +7,7 @@ stylesheets[all][] = common_test.css stylesheets[print][] = common_test.print.css hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/common_test_cron_helper.info b/docroot/modules/simpletest/tests/common_test_cron_helper.info index bf8a7290c..dd5487d3a 100644 --- a/docroot/modules/simpletest/tests/common_test_cron_helper.info +++ b/docroot/modules/simpletest/tests/common_test_cron_helper.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/database_test.info b/docroot/modules/simpletest/tests/database_test.info index 3ff31eda4..2707a7b98 100644 --- a/docroot/modules/simpletest/tests/database_test.info +++ b/docroot/modules/simpletest/tests/database_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info b/docroot/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info index b9715351b..1934fd4a7 100644 --- a/docroot/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info +++ b/docroot/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info @@ -7,8 +7,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/docroot/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index f918fdc20..d4826bebb 100644 --- a/docroot/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/docroot/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/docroot/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info index 9edaf9f6b..f2a8cff06 100644 --- a/docroot/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info +++ b/docroot/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/entity_cache_test.info b/docroot/modules/simpletest/tests/entity_cache_test.info index 212ce8334..82f10dbff 100644 --- a/docroot/modules/simpletest/tests/entity_cache_test.info +++ b/docroot/modules/simpletest/tests/entity_cache_test.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = entity_cache_test_dependency hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/entity_cache_test_dependency.info b/docroot/modules/simpletest/tests/entity_cache_test_dependency.info index 58049876d..b69b4a28c 100644 --- a/docroot/modules/simpletest/tests/entity_cache_test_dependency.info +++ b/docroot/modules/simpletest/tests/entity_cache_test_dependency.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/entity_crud_hook_test.info b/docroot/modules/simpletest/tests/entity_crud_hook_test.info index 9f5f3eadc..94f34b6af 100644 --- a/docroot/modules/simpletest/tests/entity_crud_hook_test.info +++ b/docroot/modules/simpletest/tests/entity_crud_hook_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/entity_query_access_test.info b/docroot/modules/simpletest/tests/entity_query_access_test.info index 328e5d9c4..1c1bbf789 100644 --- a/docroot/modules/simpletest/tests/entity_query_access_test.info +++ b/docroot/modules/simpletest/tests/entity_query_access_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/error_test.info b/docroot/modules/simpletest/tests/error_test.info index bf6e044b9..f53429116 100644 --- a/docroot/modules/simpletest/tests/error_test.info +++ b/docroot/modules/simpletest/tests/error_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/file_test.info b/docroot/modules/simpletest/tests/file_test.info index 3ceb3ebe0..da253a89b 100644 --- a/docroot/modules/simpletest/tests/file_test.info +++ b/docroot/modules/simpletest/tests/file_test.info @@ -6,8 +6,7 @@ core = 7.x files[] = file_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/filter_test.info b/docroot/modules/simpletest/tests/filter_test.info index 96c6c4b51..c660e0122 100644 --- a/docroot/modules/simpletest/tests/filter_test.info +++ b/docroot/modules/simpletest/tests/filter_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/form_test.info b/docroot/modules/simpletest/tests/form_test.info index 7706be2b1..1c93e0dff 100644 --- a/docroot/modules/simpletest/tests/form_test.info +++ b/docroot/modules/simpletest/tests/form_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/image_test.info b/docroot/modules/simpletest/tests/image_test.info index 82d2a3bac..6605d3d42 100644 --- a/docroot/modules/simpletest/tests/image_test.info +++ b/docroot/modules/simpletest/tests/image_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/menu_test.info b/docroot/modules/simpletest/tests/menu_test.info index 26d70dc62..baa7b5a5e 100644 --- a/docroot/modules/simpletest/tests/menu_test.info +++ b/docroot/modules/simpletest/tests/menu_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/module_test.info b/docroot/modules/simpletest/tests/module_test.info index 1ebdd8591..c916d5bba 100644 --- a/docroot/modules/simpletest/tests/module_test.info +++ b/docroot/modules/simpletest/tests/module_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/path_test.info b/docroot/modules/simpletest/tests/path_test.info index 43ecd96dd..f30412a56 100644 --- a/docroot/modules/simpletest/tests/path_test.info +++ b/docroot/modules/simpletest/tests/path_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/psr_0_test/psr_0_test.info b/docroot/modules/simpletest/tests/psr_0_test/psr_0_test.info index ca69f5c21..deada7b61 100644 --- a/docroot/modules/simpletest/tests/psr_0_test/psr_0_test.info +++ b/docroot/modules/simpletest/tests/psr_0_test/psr_0_test.info @@ -5,8 +5,7 @@ core = 7.x hidden = TRUE package = Testing -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/psr_4_test/psr_4_test.info b/docroot/modules/simpletest/tests/psr_4_test/psr_4_test.info index 75e5b0cd8..c2dde66fe 100644 --- a/docroot/modules/simpletest/tests/psr_4_test/psr_4_test.info +++ b/docroot/modules/simpletest/tests/psr_4_test/psr_4_test.info @@ -5,8 +5,7 @@ core = 7.x hidden = TRUE package = Testing -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/requirements1_test.info b/docroot/modules/simpletest/tests/requirements1_test.info index c5b3a6061..3fca686f1 100644 --- a/docroot/modules/simpletest/tests/requirements1_test.info +++ b/docroot/modules/simpletest/tests/requirements1_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/requirements2_test.info b/docroot/modules/simpletest/tests/requirements2_test.info index b12197e8d..f09c28dc8 100644 --- a/docroot/modules/simpletest/tests/requirements2_test.info +++ b/docroot/modules/simpletest/tests/requirements2_test.info @@ -7,8 +7,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/session_test.info b/docroot/modules/simpletest/tests/session_test.info index 4987deae3..5057671d2 100644 --- a/docroot/modules/simpletest/tests/session_test.info +++ b/docroot/modules/simpletest/tests/session_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_dependencies_test.info b/docroot/modules/simpletest/tests/system_dependencies_test.info index 4b03f2928..4ab29b990 100644 --- a/docroot/modules/simpletest/tests/system_dependencies_test.info +++ b/docroot/modules/simpletest/tests/system_dependencies_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = _missing_dependency -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info b/docroot/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info index cb2749e3e..f08899009 100644 --- a/docroot/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info +++ b/docroot/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = system_incompatible_core_version_test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_incompatible_core_version_test.info b/docroot/modules/simpletest/tests/system_incompatible_core_version_test.info index 338521f60..6e64ea55e 100644 --- a/docroot/modules/simpletest/tests/system_incompatible_core_version_test.info +++ b/docroot/modules/simpletest/tests/system_incompatible_core_version_test.info @@ -5,8 +5,7 @@ version = VERSION core = 5.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info b/docroot/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info index edf6dd12b..f2428bb3b 100644 --- a/docroot/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info +++ b/docroot/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info @@ -7,8 +7,7 @@ hidden = TRUE ; system_incompatible_module_version_test declares version 1.0 dependencies[] = system_incompatible_module_version_test (>2.0) -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_incompatible_module_version_test.info b/docroot/modules/simpletest/tests/system_incompatible_module_version_test.info index 51f3efc5b..148170a8c 100644 --- a/docroot/modules/simpletest/tests/system_incompatible_module_version_test.info +++ b/docroot/modules/simpletest/tests/system_incompatible_module_version_test.info @@ -5,8 +5,7 @@ version = 1.0 core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_project_namespace_test.info b/docroot/modules/simpletest/tests/system_project_namespace_test.info index 1507739b5..a6a2340a3 100644 --- a/docroot/modules/simpletest/tests/system_project_namespace_test.info +++ b/docroot/modules/simpletest/tests/system_project_namespace_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = drupal:filter -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/system_test.info b/docroot/modules/simpletest/tests/system_test.info index 4b6175b54..8f06e417e 100644 --- a/docroot/modules/simpletest/tests/system_test.info +++ b/docroot/modules/simpletest/tests/system_test.info @@ -6,8 +6,7 @@ core = 7.x files[] = system_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/taxonomy_test.info b/docroot/modules/simpletest/tests/taxonomy_test.info index 3ccf2299e..14d51a893 100644 --- a/docroot/modules/simpletest/tests/taxonomy_test.info +++ b/docroot/modules/simpletest/tests/taxonomy_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = taxonomy -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/theme_test.info b/docroot/modules/simpletest/tests/theme_test.info index f5cb1eaf4..ee68377d1 100644 --- a/docroot/modules/simpletest/tests/theme_test.info +++ b/docroot/modules/simpletest/tests/theme_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info b/docroot/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info index ed247b7ef..718830f07 100644 --- a/docroot/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info +++ b/docroot/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info @@ -6,8 +6,7 @@ hidden = TRUE settings[basetheme_only] = base theme value settings[subtheme_override] = base theme value -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info b/docroot/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info index dfd8bd8a5..17b6fd152 100644 --- a/docroot/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info +++ b/docroot/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info @@ -6,8 +6,7 @@ hidden = TRUE settings[subtheme_override] = subtheme value -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/themes/test_theme/test_theme.info b/docroot/modules/simpletest/tests/themes/test_theme/test_theme.info index c132c9104..b57bc12dd 100644 --- a/docroot/modules/simpletest/tests/themes/test_theme/test_theme.info +++ b/docroot/modules/simpletest/tests/themes/test_theme/test_theme.info @@ -17,8 +17,7 @@ stylesheets[all][] = system.base.css settings[theme_test_setting] = default value -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info b/docroot/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info index a4f5649e8..29a66bcd1 100644 --- a/docroot/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info +++ b/docroot/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info @@ -4,8 +4,7 @@ core = 7.x hidden = TRUE engine = nyan_cat -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/update_script_test.info b/docroot/modules/simpletest/tests/update_script_test.info index f3bfc50b8..a84f716cc 100644 --- a/docroot/modules/simpletest/tests/update_script_test.info +++ b/docroot/modules/simpletest/tests/update_script_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/update_test_1.info b/docroot/modules/simpletest/tests/update_test_1.info index a7431d5de..c9d4661ae 100644 --- a/docroot/modules/simpletest/tests/update_test_1.info +++ b/docroot/modules/simpletest/tests/update_test_1.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/update_test_2.info b/docroot/modules/simpletest/tests/update_test_2.info index a7431d5de..c9d4661ae 100644 --- a/docroot/modules/simpletest/tests/update_test_2.info +++ b/docroot/modules/simpletest/tests/update_test_2.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/update_test_3.info b/docroot/modules/simpletest/tests/update_test_3.info index a7431d5de..c9d4661ae 100644 --- a/docroot/modules/simpletest/tests/update_test_3.info +++ b/docroot/modules/simpletest/tests/update_test_3.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/url_alter_test.info b/docroot/modules/simpletest/tests/url_alter_test.info index 23676af5c..98436f8cf 100644 --- a/docroot/modules/simpletest/tests/url_alter_test.info +++ b/docroot/modules/simpletest/tests/url_alter_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/simpletest/tests/xmlrpc_test.info b/docroot/modules/simpletest/tests/xmlrpc_test.info index ab787cc30..f0a21cc72 100644 --- a/docroot/modules/simpletest/tests/xmlrpc_test.info +++ b/docroot/modules/simpletest/tests/xmlrpc_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/statistics/statistics.info b/docroot/modules/statistics/statistics.info index 26c1794e8..5d13982d3 100644 --- a/docroot/modules/statistics/statistics.info +++ b/docroot/modules/statistics/statistics.info @@ -6,8 +6,7 @@ core = 7.x files[] = statistics.test configure = admin/config/system/statistics -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/syslog/syslog.info b/docroot/modules/syslog/syslog.info index 3f8b6ca4b..5e1aae572 100644 --- a/docroot/modules/syslog/syslog.info +++ b/docroot/modules/syslog/syslog.info @@ -6,8 +6,7 @@ core = 7.x files[] = syslog.test configure = admin/config/development/logging -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/system/system.info b/docroot/modules/system/system.info index da08a99ef..7914ef22e 100644 --- a/docroot/modules/system/system.info +++ b/docroot/modules/system/system.info @@ -12,8 +12,7 @@ files[] = system.test required = TRUE configure = admin/config/system -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/system/tests/cron_queue_test.info b/docroot/modules/system/tests/cron_queue_test.info index 86d9e089b..f05489662 100644 --- a/docroot/modules/system/tests/cron_queue_test.info +++ b/docroot/modules/system/tests/cron_queue_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/system/tests/system_cron_test.info b/docroot/modules/system/tests/system_cron_test.info index 662c7c457..ea9c7116a 100644 --- a/docroot/modules/system/tests/system_cron_test.info +++ b/docroot/modules/system/tests/system_cron_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/taxonomy/taxonomy.info b/docroot/modules/taxonomy/taxonomy.info index 1f2fec809..d93159569 100644 --- a/docroot/modules/taxonomy/taxonomy.info +++ b/docroot/modules/taxonomy/taxonomy.info @@ -8,8 +8,7 @@ files[] = taxonomy.module files[] = taxonomy.test configure = admin/structure/taxonomy -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/toolbar/toolbar.info b/docroot/modules/toolbar/toolbar.info index f02576123..9ec383928 100644 --- a/docroot/modules/toolbar/toolbar.info +++ b/docroot/modules/toolbar/toolbar.info @@ -4,8 +4,7 @@ core = 7.x package = Core version = VERSION -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/tracker/tracker.info b/docroot/modules/tracker/tracker.info index d7cb61b6b..568a4e1af 100644 --- a/docroot/modules/tracker/tracker.info +++ b/docroot/modules/tracker/tracker.info @@ -6,8 +6,7 @@ version = VERSION core = 7.x files[] = tracker.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/translation/tests/translation_test.info b/docroot/modules/translation/tests/translation_test.info index 9b597a0e0..5e5620f86 100644 --- a/docroot/modules/translation/tests/translation_test.info +++ b/docroot/modules/translation/tests/translation_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/translation/translation.info b/docroot/modules/translation/translation.info index 3e6513f00..c6e747727 100644 --- a/docroot/modules/translation/translation.info +++ b/docroot/modules/translation/translation.info @@ -6,8 +6,7 @@ version = VERSION core = 7.x files[] = translation.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/trigger/tests/trigger_test.info b/docroot/modules/trigger/tests/trigger_test.info index 13e0698d2..8486e1fd8 100644 --- a/docroot/modules/trigger/tests/trigger_test.info +++ b/docroot/modules/trigger/tests/trigger_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/trigger/trigger.info b/docroot/modules/trigger/trigger.info index 4c21ba8f0..0a6efeb21 100644 --- a/docroot/modules/trigger/trigger.info +++ b/docroot/modules/trigger/trigger.info @@ -6,8 +6,7 @@ core = 7.x files[] = trigger.test configure = admin/structure/trigger -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/aaa_update_test.info b/docroot/modules/update/tests/aaa_update_test.info index 96ac28aa0..1542255bc 100644 --- a/docroot/modules/update/tests/aaa_update_test.info +++ b/docroot/modules/update/tests/aaa_update_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/bbb_update_test.info b/docroot/modules/update/tests/bbb_update_test.info index 954fb75b8..3efd66374 100644 --- a/docroot/modules/update/tests/bbb_update_test.info +++ b/docroot/modules/update/tests/bbb_update_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/ccc_update_test.info b/docroot/modules/update/tests/ccc_update_test.info index f3b7d043b..9387a037b 100644 --- a/docroot/modules/update/tests/ccc_update_test.info +++ b/docroot/modules/update/tests/ccc_update_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info b/docroot/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info index d21dd9ca1..2b1e2b9d5 100644 --- a/docroot/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info +++ b/docroot/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info @@ -3,8 +3,7 @@ description = Test theme which is used as admin theme. core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info b/docroot/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info index 07eb50ff5..1f361db80 100644 --- a/docroot/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info +++ b/docroot/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info @@ -3,8 +3,7 @@ description = Test theme which acts as a base theme for other test subthemes. core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info b/docroot/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info index 26b480c51..81428d278 100644 --- a/docroot/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info +++ b/docroot/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info @@ -4,8 +4,7 @@ core = 7.x base theme = update_test_basetheme hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/tests/update_test.info b/docroot/modules/update/tests/update_test.info index 7b42bc2ef..b989a7584 100644 --- a/docroot/modules/update/tests/update_test.info +++ b/docroot/modules/update/tests/update_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/update/update.info b/docroot/modules/update/update.info index 4d9c36917..2ec8ee7b5 100644 --- a/docroot/modules/update/update.info +++ b/docroot/modules/update/update.info @@ -6,8 +6,7 @@ core = 7.x files[] = update.test configure = admin/reports/updates/settings -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/user/tests/user_form_test.info b/docroot/modules/user/tests/user_form_test.info index 17ce34a5e..b275c3552 100644 --- a/docroot/modules/user/tests/user_form_test.info +++ b/docroot/modules/user/tests/user_form_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/modules/user/user.info b/docroot/modules/user/user.info index 83e2b8e36..331ad59c0 100644 --- a/docroot/modules/user/user.info +++ b/docroot/modules/user/user.info @@ -9,8 +9,7 @@ required = TRUE configure = admin/config/people stylesheets[all][] = user.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/profiles/README.txt b/docroot/profiles/README.txt new file mode 100644 index 000000000..91d012ba2 --- /dev/null +++ b/docroot/profiles/README.txt @@ -0,0 +1,28 @@ +Installation profiles define additional steps that run after the base +installation provided by Drupal core when Drupal is first installed. + +WHAT TO PLACE IN THIS DIRECTORY? +-------------------------------- + +Place downloaded and custom installation profiles in this directory. +Installation profiles are generally provided as part of a Drupal distribution. +They only impact the installation of your site. They do not have any effect on +an already running site. + +DOWNLOAD ADDITIONAL DISTRIBUTIONS +--------------------------------- + +Contributed distributions from the Drupal community may be downloaded at +https://www.drupal.org/project/project_distribution. + +MULTISITE CONFIGURATION +----------------------- + +In multisite configurations, installation profiles found in this directory are +available to all sites during their initial site installation. + +MORE INFORMATION +---------------- + +Refer to the "Installation profiles" section of the README.txt in the Drupal +root directory for further information on extending Drupal with custom profiles. diff --git a/docroot/profiles/minimal/minimal.info b/docroot/profiles/minimal/minimal.info index 1b363abdd..933068c88 100644 --- a/docroot/profiles/minimal/minimal.info +++ b/docroot/profiles/minimal/minimal.info @@ -5,8 +5,7 @@ core = 7.x dependencies[] = block dependencies[] = dblog -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/profiles/minimal/translations/README.txt b/docroot/profiles/minimal/translations/README.txt new file mode 100644 index 000000000..a0afa5166 --- /dev/null +++ b/docroot/profiles/minimal/translations/README.txt @@ -0,0 +1,3 @@ + +This directory should be used to place downloaded translations +for installing Drupal core. diff --git a/docroot/profiles/standard/standard.info b/docroot/profiles/standard/standard.info index a3fd9e29e..b56253df4 100644 --- a/docroot/profiles/standard/standard.info +++ b/docroot/profiles/standard/standard.info @@ -24,8 +24,7 @@ dependencies[] = field_ui dependencies[] = file dependencies[] = rdf -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/profiles/standard/translations/README.txt b/docroot/profiles/standard/translations/README.txt new file mode 100644 index 000000000..a0afa5166 --- /dev/null +++ b/docroot/profiles/standard/translations/README.txt @@ -0,0 +1,3 @@ + +This directory should be used to place downloaded translations +for installing Drupal core. diff --git a/docroot/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/docroot/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index 7a11e3290..995e28341 100644 --- a/docroot/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/docroot/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE files[] = drupal_system_listing_compatible_test.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/docroot/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info index d2bd94792..45d365989 100644 --- a/docroot/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info +++ b/docroot/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info @@ -8,8 +8,7 @@ version = VERSION core = 6.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/profiles/testing/testing.info b/docroot/profiles/testing/testing.info index e9fec6dc7..0b2a332cb 100644 --- a/docroot/profiles/testing/testing.info +++ b/docroot/profiles/testing/testing.info @@ -4,8 +4,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/sites/README.txt b/docroot/sites/README.txt new file mode 100644 index 000000000..9aecef2d7 --- /dev/null +++ b/docroot/sites/README.txt @@ -0,0 +1,19 @@ +This directory structure contains the settings and configuration files specific +to your site or sites and is an integral part of multisite configuration. + +The sites/all/ subdirectory structure should be used to place your custom and +downloaded extensions including modules, themes, and third party libraries. + +Downloaded installation profiles should be placed in the /profiles directory +in the Drupal root. + +In multisite configuration, extensions found in the sites/all directory +structure are available to all sites. Alternatively, the sites/your_site_name/ +subdirectory pattern may be used to restrict extensions to a specific +site instance. + +See the respective README.txt files in sites/all/themes and sites/all/modules +for additional information about obtaining and organizing extensions. + +See INSTALL.txt in the Drupal root for information about single-site +installation or multisite configuration. diff --git a/docroot/sites/all/libraries/README.txt b/docroot/sites/all/libraries/README.txt new file mode 100644 index 000000000..de5d58573 --- /dev/null +++ b/docroot/sites/all/libraries/README.txt @@ -0,0 +1,2 @@ +This directory should be used to place downloaded and custom libraries (such as +JavaScript libraries) which are used by contributed or custom modules. diff --git a/docroot/sites/all/modules/README.txt b/docroot/sites/all/modules/README.txt new file mode 100644 index 000000000..b19849bb3 --- /dev/null +++ b/docroot/sites/all/modules/README.txt @@ -0,0 +1,37 @@ +Modules extend your site functionality beyond Drupal core. + +WHAT TO PLACE IN THIS DIRECTORY? +-------------------------------- + +Placing downloaded and custom modules in this directory separates downloaded and +custom modules from Drupal core's modules. This allows Drupal core to be updated +without overwriting these files. + +DOWNLOAD ADDITIONAL MODULES +--------------------------- + +Contributed modules from the Drupal community may be downloaded at +https://www.drupal.org/project/project_module. + +ORGANIZING MODULES IN THIS DIRECTORY +------------------------------------ + +You may create subdirectories in this directory, to organize your added modules, +without breaking the site. Some common subdirectories include "contrib" for +contributed modules, and "custom" for custom modules. Note that if you move a +module to a subdirectory after it has been enabled, you may need to clear the +Drupal cache so it can be found. (Alternatively, you can disable the module +before moving it and then re-enable it after the move.) + +MULTISITE CONFIGURATION +----------------------- + +In multisite configurations, modules found in this directory are available to +all sites. Alternatively, the sites/your_site_name/modules directory pattern +may be used to restrict modules to a specific site instance. + +MORE INFORMATION +---------------- + +Refer to the "Developing for Drupal" section of the README.txt in the Drupal +root directory for further information on extending Drupal with custom modules. diff --git a/docroot/sites/all/modules/contrib/acquia_connector/README.txt b/docroot/sites/all/modules/contrib/acquia_connector/README.txt new file mode 100644 index 000000000..ad750fd4e --- /dev/null +++ b/docroot/sites/all/modules/contrib/acquia_connector/README.txt @@ -0,0 +1,83 @@ +Acquia Connector modules +================================================================================ + +An Acquia subscription [1] enhances the Drupal experience by providing the +support and network services to operate a trouble-free Drupal website. +Acquia subscriptions let you gain access to remote network services, +documentation and the Acquia forums. Premium subscriptions provide web-based +support ticket management, as well as telephone support. + +These modules allow you to connect any Drupal 7.x site to Acquia Insight. +Acquia also has a distribution of Drupal called Acquia Drupal which is +composed of purely open source GPL licensed components. If you are looking +for a quick start with Drupal, Acquia Drupal [2] might be of great use for you. +(Note that a few Acquia Subscription services, such as the update notification and +code modification detection services, currently only work with Acquia Drupal.) + +[1] http://acquia.com/products-services/acquia-network +[2] http://acquia.com/products-services/acquia-drupal + +Modules in this project +-------------------------------------------------------------------------------- + +Acquia agent: Enables secure communication between your Drupal sites and +Acquia Insight to monitor uptime, check for updates, and collect site +information. + +Acquia Site profile: Automates the collection of site information - +operating system, database, webserver, and PHP versions, installed modules, +and site modifications - to speed support communication and issue resolution. + +Acquia Search: Provides integration between your Drupal site and Acquia's +hosted search service. Requires Apache Solr Search Integration module. + +Installation +-------------------------------------------------------------------------------- + +Consult the online documentation at https://docs.acquia.com/network/install for +installation instructions. + +Notes on Acquia Search data protection and index auto-switching +-------------------------------------------------------------------------------- + +Acquia Search module attempts to auto-detect your environment and automatically +connect to the best-fit Acquia Search index available. This is done to attempt +to protect your data in your production Solr instance; otherwise a development +site could easily overwrite or delete the data in your production index. + +This functionality was previously available as a third-party module +https://www.drupal.org/project/acquia_search_multi_subs which will now become +deprecated. + +Depending on the indexes already provisioned on your Acquia Subscription, the +module will follow these rules to connect to the proper index: + +* If your site is running within Acquia Cloud, Acquia Search will connect to + the index name that matches the current environment (dev/stage/prod) and + current multi-site instance. +* If the module can't find an appropriate index above, it will then enforce + READ-ONLY mode on the production Solr index. This allows you to still test + searching from any site while protecting your production, user-facing index. + +The current state is noted on the Drupal UI's general status report at +/admin/reports/status, as well as when attempting to edit each connection. + +You can override this behavior using code snippets or a Drupal variable. This, +however, poses risks to your data that you should be aware of. Please consult +our documentation at https://docs.acquia.com/acquia-search/multiple-cores to +find out more. + +Maintainers +-------------------------------------------------------------------------------- + +These modules are maintained by developers at Acquia. For more information on +the company and our offerings, see http://acquia.com/ + +Issues +-------------------------------------------------------------------------------- + +Contact Acquia Support if you have support questions regarding your site. + +If you have issues with the submodules included in the Acquia Connector package, +you are also welcome to submit issues at http://drupal.org/project/acquia_connector +(all submitted issues are public). diff --git a/docroot/sites/all/modules/contrib/acquia_purge/INSTALL.txt b/docroot/sites/all/modules/contrib/acquia_purge/INSTALL.txt new file mode 100644 index 000000000..6a41ecca7 --- /dev/null +++ b/docroot/sites/all/modules/contrib/acquia_purge/INSTALL.txt @@ -0,0 +1,26 @@ +Installation +================================================================================ + +Acquia Purge has been designed from the ground up to be extremely simple and +almost failsafe to use. The module provides the /means/ to purge all load +balancers on Acquia Cloud and focuses on doing that well, where the Expire +module remains responsible for telling what needs to be purged. Setting up both +modules shouldn't take long: + +1. Ensure you are not running incompatible modules like purge, varnish or boost. + +2. Download expire and acquia_purge into your site. + e.g.: drush dl expire acquia_purge + +3. Enable both modules. + e.g.: drush en expire acquia_purge + +4. Assign the "purge on-screen" permission to editor roles to give them a + visually indicative progress bar upon saving content. Purges still happen + without this permission on the background (triggered via AJAX). + +5. It's highly recommended to visit the status report page or to run + "drush ap-diagnosis", in which Acquia Purge will perform diagnostic tests. + +Do you have any questions, bugs or comments? Feel free to lookup common +questions in the FAQ.txt file or file a issue on Drupal.org. diff --git a/docroot/sites/all/modules/contrib/acquia_purge/README.txt b/docroot/sites/all/modules/contrib/acquia_purge/README.txt new file mode 100644 index 000000000..357f28779 --- /dev/null +++ b/docroot/sites/all/modules/contrib/acquia_purge/README.txt @@ -0,0 +1,194 @@ +Readme +================================================================================ +The Acquia Purge module allows Drupal sites hosted on Acquia Cloud to +automatically purge (wipe) pages from their Varnish powered load balancers, as +soon as content actually changed. The higher Drupal's "expiration of cached +pages"-setting (TTL) is configured the more your site will be served directly +off your load balancers. This effectively increases the efficiency of your site +and lowers hardware costs, leaving more resources for back-end traffic. In most +scenarios the module offers a full turn-key experience without requiring any +technical configuration. + +Features: + * Built with editorial people and end-users in mind. + * On-screen progress-bar showing pages being cleared and made public. + * Turn-key installation for simple content sites. + * Wipes pages based on detected changes by the expire module. + * Integration with Rules allowing to wipe pages like 'news' and 'contact'. + * Transparently wipes pages from Drupal's page cache. + * Detects your Acquia Cloud domain names allowing manual overriding. + * Support for both Domain Access and multi-site setups. + * Detailed watchdog logging on everything that happens. + * Atomic operation based on AJAX and the Queue API. + * Manual purge feature for emergency administration needs. + * Drush: ap-diagnosis, ap-domains, ap-forget, ap-list, ap-process, ap-purge. + +Why do I need this? +================================================================================ +Throughout the years the Acquia Support department has seen thousands of Drupal +sites pass by on daily basis and one of the most typical things we have noticed +is that many sites run with a very low "expiration of cached pages"-setting +(e.g. 5 minutes). This means that every single page ever generated by Drupal +will be cached very shortly by your load balancer and regenerated for no reason +just a couple of minutes after that. This puts your web servers under the +constant task of generating pages regardless if they actually changed or not. + +By applying proactive purging on your site, it will actively tell your load +balancers what pages to forget while keeping the others in cache for much +longer. This hugely decreases the stress on your web servers and leaves more +"PHP processes" available for actual back-end traffic. Basically every site will +benefit from implementing this, especially content-focused sites like news +sites, blogs and brand sites. + +Configurability +================================================================================ +By strict design and principle, this module doesn't have any UI exposed settings +or configuration forms. The reason behind this philosophy is that - as a pure - +utility module only site administrators should be able to change anything and if +they do, things should be traceable in settings.php. Although Acquia Purge +attempts to stay as turnkey and zeroconf as possible, the following options +exist as of this version and documented below: + +╔══════════════════════════╦═══════╦═══════════════════════════════════════════╗ +║ $conf setting ║ Deflt ║ Description ║ +╠══════════════════════════╬═══════╬═══════════════════════════════════════════╣ +║ acquia_purge_domains ║ FALSE ║ Allows you to control which domains will ║ +║ ║ ║ get purged, see DOMAINS.txt ║ +║ ║ ║ ║ +║ acquia_purge_sphpskippath║ TRUE ║ By default, the sites.php domain detection║ +║ ║ ║ skips records that do not end on a known ║ +║ ║ ║ TLD, as it assumes the remainder to be a ║ +║ ║ ║ path. Disabling this, enables experimental║ +║ ║ ║ support for supporting all of sites.php. ║ +║ ║ ║ $conf['acquia_purge_sphpskippath'] = FALSE║ +║ ║ ║ ║ +║ acquia_purge_stripports ║ 80,443║ Ports stripped from records in sites.php ║ +║ ║ ║ that start with a first octet that is ║ +║ ║ ║ numeric, e.g.: '443.domain.com'. Ports ║ +║ ║ ║ outside this setting are not stripped ║ +║ ║ ║ from detected domains. ║ +║ ║ ║ $conf['acquia_purge_stripports'] = [80]; ║ +║ ║ ║ ║ +║ acquia_purge_cron ║ FALSE ║ Once enabled, this will process queue ║ +║ ║ ║ items during cron. The client side AJAX ║ +║ ║ ║ processor cannot be disabled, but it will ║ +║ ║ ║ run less, especially combined with late ║ +║ ║ ║ runtime processing enabled. ║ +║ ║ ║ $conf['acquia_purge_cron'] = TRUE; ║ +║ ║ ║ ║ +║ acquia_purge_lateruntime ║ FALSE ║ When enabled, processing of the queue will║ +║ ║ ║ start during the same request items got ║ +║ ║ ║ added to it. Queues clear quicker and the ║ +║ ║ ║ role of the client-side AJAX processor ║ +║ ║ ║ reduces drastically. However, this does ║ +║ ║ ║ add RISK since pages can time/out or run ║ +║ ║ ║ out of memory! Test carefully! ║ +║ ║ ║ $conf['acquia_purge_lateruntime'] = TRUE; ║ +║ ║ ║ ║ +║ acquia_purge_http ║ TRUE ║ Purging of http:// schemes, which is ║ +║ ║ ║ the default behavior. You can disable ║ +║ ║ ║ it with FALSE, as long as you then do ║ +║ ║ ║ purge https://. Else the system will ║ +║ ║ ║ shut itself down and report an error. ║ +║ ║ ║ $conf['acquia_purge_http'] = FALSE; ║ +║ ║ ║ ║ +║ acquia_purge_https ║ FALSE ║ EXPERIMENTAL https:// scheme support, ║ +║ ║ ║ disabled by default. Once enabled the ║ +║ ║ ║ total amount of work done will double, ║ +║ ║ ║ so monitor your system closely and ║ +║ ║ ║ consider disabling http:// if your site ║ +║ ║ ║ is fully https:// based (redirecting). ║ +║ ║ ║ $conf['acquia_purge_https'] = TRUE; ║ +║ ║ ║ ║ +║ acquia_purge_token ║ FALSE ║ If set, this allows you to set a custom ║ +║ ║ ║ X-Acquia-Purge header value. This helps ║ +║ ║ ║ offset DDOS style attacks but requires ║ +║ ║ ║ balancer level configuration chances for ║ +║ ║ ║ you need to contact Acquia Support. ║ +║ ║ ║ $conf['acquia_purge_token'] = 'secret'; ║ +║ ║ ║ ║ +║ acquia_purge_base_path ║(auto) ║ In some cases Drupal isn't served on the ║ +║ ║ ║ same URL as where it's edited, which will ║ +║ ║ ║ cause different paths to be purged than ║ +║ ║ ║ necessary. By overriding this setting, ║ +║ ║ ║ Drupal's base_path() will no longer be ║ +║ ║ ║ used to construct purges. Use only when ║ +║ ║ ║ you know what you are doing. ║ +║ ║ ║ $conf['acquia_purge_base_path'] = '/sub/';║ +║ ║ ║ ║ +║ acquia_purge_errorlimit ║ TRUE ║ The system shuts down when it counted too ║ +║ ║ ║ many HTTP errors. When TRUE, this limit is║ +║ ║ ║ calculated with "slowdown factor^3", use ║ +║ ║ ║ 'drush apd' to see the actual factor. If ║ +║ ║ ║ you want a static limit instead, this has ║ +║ ║ ║ to be set as integer value, e.g: ║ +║ ║ ║ $conf['acquia_purge_errorlimit'] = 500; ║ +║ ║ ║ ║ +║ acquia_purge_log_success ║ TRUE ║ By default this module will log both ║ +║ ║ ║ successes and failure, which is helpful ║ +║ ║ ║ for those setting the module up. But once ║ +║ ║ ║ implemented and working fine, it can ║ +║ ║ ║ be heavy on your log files. By setting ║ +║ ║ ║ this to FALSE, only failure will be put ║ +║ ║ ║ into your logs and thus reduce queries ║ +║ ║ ║ or disk writes (for log files). ║ +║ ║ ║ $conf['acquia_purge_log_success'] = FALSE;║ +║ ║ ║ ║ +║ acquia_purge_variations ║ TRUE ║ If enabled, this aids administrators using║ +║ ║ ║ 'drush ap-purge' or the manual purge form ║ +║ ║ ║ as it will automatically purge common ║ +║ ║ ║ variations of the paths to be purged. For ║ +║ ║ ║ instance, versions with ?page parameters ║ +║ ║ ║ and paths with trailing slashes are ║ +║ ║ ║ made up for every manually purged path but║ +║ ║ ║ this behavior can be disabled with: ║ +║ ║ ║ $conf['acquia_purge_variations'] = FALSE; ║ +║ ║ ║ ║ +║ acquia_purge_memcache ║ TRUE ║ Determines whether Acquia Purge needs to ║ +║ ║ ║ store its state data in memory when ║ +║ ║ ║ $conf['cache_default_class'] is set to use║ +║ ║ ║ it. This reduces I/O activity drastically ║ +║ ║ ║ compared to the fallback file based state ║ +║ ║ ║ storage and also improves deduplication of║ +║ ║ ║ queue items drastically. If you are seeing║ +║ ║ ║ issues with queuing and purging items, you║ +║ ║ ║ can consider disabling it followed by ║ +║ ║ ║ 'drush ap-forget' to see if that works. ║ +║ ║ ║ $conf['acquia_purge_memcache'] = FALSE; ║ +║ ║ ║ ║ +║ acquia_purge_passivemode ║ FALSE ║ When set to TRUE, this will cause the ║ +║ ║ ║ hook_expire_cache() implementation to stop║ +║ ║ ║ working and effectively allows the module ║ +║ ║ ║ to remain enabled in local environments ║ +║ ║ ║ without actually purging automatically. ║ +║ ║ ║ $conf['acquia_purge_passivemode'] = TRUE; ║ +║ ║ ║ ║ +║ acquia_purge_silentmode ║ FALSE ║ TRUE hides the client-side AJAX processor ║ +║ ║ ║ regardless of what the "purge on-screen" ║ +║ ║ ║ permission is set to. It is not possible ║ +║ ║ ║ to disable the processor, but its role is ║ +║ ║ ║ highly reduced in combination with cron ║ +║ ║ ║ mode and late runtime processing. ║ +║ ║ ║ $conf['acquia_purge_silentmode'] = TRUE; ║ +║ ║ ║ ║ +║ acquia_purge_allriskmode ║ FALSE ║ When set to TRUE, this disables full ║ +║ ║ ║ blocking checks for too high queue volumes║ +║ ║ ║ and too many domain names. Using this mode║ +║ ║ ║ excludes your support SLA entitlement and ║ +║ ║ ║ rules out support on these checks from the║ +║ ║ ║ Acquia Purge issue queue. ║ +║ ║ ║ $conf['acquia_purge_allriskmode'] = TRUE; ║ +║ ║ ║ ║ +║ acquia_purge_smartqueue ║ FALSE ║ When set to TRUE, the smart queue backend ║ +║ ║ ║ will be loaded instead. It automatically ║ +║ ║ ║ disregards items that Varnish has already ║ +║ ║ ║ dropped and this backend can be a big ║ +║ ║ ║ efficiency improvement on sites with TTLs ║ +║ ║ ║ not set to weeks or months. One BIG FAT ║ +║ ║ ║ WARNING: if your site dynamically sets the║ +║ ║ ║ page_cache_maximum_age variable or max-age║ +║ ║ ║ Cache-Control header value, using this ║ +║ ║ ║ backend will make purging VERY UNRELIABLE!║ +║ ║ ║ $conf['acquia_purge_smartqueue'] = TRUE; ║ +║ ║ ║ ║ +╚══════════════════════════╩═══════╩═══════════════════════════════════════════╝ diff --git a/docroot/sites/all/modules/contrib/acquia_search_multi_subs/README.txt b/docroot/sites/all/modules/contrib/acquia_search_multi_subs/README.txt new file mode 100644 index 000000000..d0bbf4e8c --- /dev/null +++ b/docroot/sites/all/modules/contrib/acquia_search_multi_subs/README.txt @@ -0,0 +1,34 @@ +This module allows you to switch between Acquia Search cores manually or +automatically. + +To start you should go to the Solr settings and edit them (see below for +details). By default the module will be enabled and will automatically detect if +you are entitled to multiple cores. + +To verify if you have multiple cores available, you can deselect the +"Automatically switch when an Acquia Environment is detected" checkbox and it +will show you a list of the search cores that are available for the subscription +that you connected with using the Acquia Connector. + +Getting to the Solr configuration: +- For the Apache Solr Search Integration module: Got to + admin/config/search/apachesolr/settings and click the Acquia Search + environment. Click "Edit" to modify the properties of this environment. +- For the Search API Solr Search module: Go to admin/config/search/search_api, + locate your Acquia Search server and click "Edit". + +If you want to test the switching locally add the following to your +settings.php file: + + $_ENV['AH_SITE_NAME'] = 'subscriptionnamedev'; + $_ENV['AH_SITE_ENVIRONMENT'] = 'dev'; + +You can find these variables when you execute the following on your Acquia +Server: + + debug($_ENV['AH_SITE_ENVIRONMENT']); + debug($_ENV['AH_SITE_NAME']); + +Alternatively you could fill in data from another subscription so that it takes +over your Acquia Search environment without disturbing the connection to the +Acquia Connector / Acquia Insight. diff --git a/docroot/sites/all/modules/contrib/ape/README.txt b/docroot/sites/all/modules/contrib/ape/README.txt new file mode 100644 index 000000000..1fdb48b06 --- /dev/null +++ b/docroot/sites/all/modules/contrib/ape/README.txt @@ -0,0 +1,43 @@ +SUMMARY +------- +Many sites run behind Varnish and have a desire for some pages to never expire +and other pages to expire as quickly as every minute. The idea behind this +module is that it provides three main features for controlling the cache-control +header: + 1. A secondary cache length that can be used for a list of exception paths. + 2. A list of paths that should be excluded from caching by setting the cache + control header to no-cache. + 3. Allow cache-control headers for 301 and 302 redirects using drupal_goto + to have individual cache lengths set. +The module also includes rules integration and manipulates the core performance +page a bit so users can find the module's configuration page. Overall it's a +fairly simple module that just manipulates the cache-control header based on +path, and possibly more complex options with Rules. + + +REQUIREMENTS +------------ +None. + + +RECOMMENDED MODULES +------------------- + * Rules (https://www.drupal.org/project/rules): + When enabled, a new action is available to set the max-age header. + + +INSTALLATION +------------ +* Install as usual, see +https://www.drupal.org/documentation/install/modules-themes/modules-7 for +further information. + + +CONFIGURATION +------------- +* Configure user permissions in Administration » People » Permissions: + - Administer advanced page expiration + Allows access to the advanced page expiration configuration page where + different criteria can be set for max-age expiration values. +* Customize the menu settings in Administration » Configuration » Performance » +Advanced page expiration. diff --git a/docroot/sites/all/modules/contrib/clamav/INSTALL.txt b/docroot/sites/all/modules/contrib/clamav/INSTALL.txt new file mode 100644 index 000000000..50bd99b3a --- /dev/null +++ b/docroot/sites/all/modules/contrib/clamav/INSTALL.txt @@ -0,0 +1,47 @@ +Requirements +------------ + +1. The module does not provide an anti-virus scanner; it integrates with + ClamAV (http://www.clamav.net), which is a free open-source anti-virus + scanner. +2. Download/install ClamAV: + - [Debian / Ubuntu]: apt-get install clamav + - [redhat / CentOS]: + 1. Enable the EPEL repo (https://fedoraproject.org/wiki/EPEL) + 2. yum install clamav + 3. yum install clamd + +Installation +------------ + +1. Enable the module +2. Go to the ClamAV configuration page (admin/settings/clamav) and set + the path to the ClamAV "clamscan" binary. On most systems this will be: + /usr/bin/clamscan + +Configuration +------------- + +By default only STREAM_WRAPPERS_LOCAL schemes are scannable, but this default +behaviour can be overridden; either in the admin UI, or with a variable. + +For example, putting this in settings.php + +$conf['clamav_overridden_schemes'] = array( + 'public', + 'external', +); + +...would override the default for the public:// and external:// schemes. + +Overriding a local scheme will stop it from being scannable, and a remote +scheme will become scannable if it is overridden. + +See: https://api.drupal.org/api/drupal/includes!stream_wrappers.inc/7 + +Acknowledgements +---------------- + +- File Framework's "antivirus" module, from which this was forked. +- james_andres (maintainer) +- manarth (maintainer) diff --git a/docroot/sites/all/modules/contrib/devel/LICENSE.txt b/docroot/sites/all/modules/contrib/devel/LICENSE.txt old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/README.txt b/docroot/sites/all/modules/contrib/devel/README.txt new file mode 100644 index 000000000..194fcbf57 --- /dev/null +++ b/docroot/sites/all/modules/contrib/devel/README.txt @@ -0,0 +1,59 @@ +README.txt +========== + +A module containing helper functions for Drupal developers and +inquisitive admins. This module can print a log of +all database queries for each page request at the bottom of each page. The +summary includes how many times each query was executed on a page, and how long +each query took. + + It also offers + - a block for running custom PHP on a page + - a block for quickly accessing devel pages + - a block for masquerading as other users (useful for testing) + - reports memory usage at bottom of page + - A mail-system class which redirects outbound email to files + - more + + This module is safe to use on a production site. Just be sure to only grant + 'access development information' permission to developers. + +Also a dpr() function is provided, which pretty prints arrays and strings. +Useful during development. Many other nice functions like dpm(), dvm(). + +AJAX developers in particular ought to install FirePHP Core from +http://www.firephp.org/ and put it in the devel directory. You may +use the devel-download drush command to download the library. If downloading by hand, +your path to fb.php should look like devel/FirePHPCore/lib/FirePHPCore/fb.php. +You can use svn checkout http://firephp.googlecode.com/svn/trunk/trunk/Libraries/FirePHPCore. +Then you can log php variables to the Firebug console. Is quite useful. + +Included in this package is also: + +- devel_node_access module which prints out the node_access records for a given node. Also offers hook_node_access_explain for all node access modules to implement. Handy. +- devel_generate.module which bulk creates nodes, users, comment, terms for development. + +Some nifty drush integration ships with devel and devel_generate. See drush help for details. + +DEVEL GENERATE EXTENSIONS +========================= +Devel Images Provider [http://drupal.org/project/devel_image_provider] allows to configure external providers for images. + +COMPATIBILITY NOTES +================== +- Modules that use AHAH may have incompatibility with the query log and other + footer info. Consider setting $GLOBALS['devel_shutdown'] = FALSE if you run into + any issues. + +DRUSH UNIT TEST +================== +See develDrushTest.php for an example of unit testing of the Drush integration. +This uses Drush's own test framework, based on PHPUnit. To run the tests, use +phpunit --bootstrap=/path/to/drush/tests/drush_testcase.inc. Note that we must name a file +under /tests there. + +AUTHOR/MAINTAINER +====================== +-moshe weitzman <weitzman at tejasa DOT com> +http://cyrve.com +Hans Salvisberg <drupal at salvisberg DOT com> diff --git a/docroot/sites/all/modules/contrib/devel/README_devel_node_access.txt b/docroot/sites/all/modules/contrib/devel/README_devel_node_access.txt new file mode 100644 index 000000000..1d9362f37 --- /dev/null +++ b/docroot/sites/all/modules/contrib/devel/README_devel_node_access.txt @@ -0,0 +1,42 @@ +README +====== + +This module contains tools for developers using access control modules +to restrict access to some nodes. It is intended to help catch some +common mistakes and provide feedback to confirm that restricted nodes +are in fact visible only to the intended users. + +Provides a summary page which queries the node_access table and +reports common mistakes such as the presence of Drupal's default entry +which grants all users read access to all nodes. Also reports the +presence of nodes not represented in node_access table. This may +occur when an access control module is installed after nodes have +already been created. + +Provides a block which shows all node_access entries for the nodes +shown on a given page. This gives developers a quick check to see +that grants are provided as they should be. This block auto-enables +to the footer region. You may move it as desired. + +If Views module is installed, allows browsing of nodes by realm, +including those nodes not in the node_access table (NULL realm). + +WISHLIST +======== + +Things I'd like to see but haven't had time to do: + +* Automatically solve common problems. I.e. delete the "all" realm + entry, and automatically save all nodes not in the node_access table. + +* Nicer feedback indicating whether nodes are visible to the public or + not. I.e. use color coding or icons. + +* Summary does not differentiate between view grants and other types + of grants. I personally use node_access only for view grants so I'm + not sure exactly what else it should show. + +AUTHOR +====== + +Dave Cohen AKA yogadex on drupal.org diff --git a/docroot/sites/all/modules/contrib/devel/devel-rtl.css b/docroot/sites/all/modules/contrib/devel/devel-rtl.css index fe784a8da..a398b9ff3 100644 --- a/docroot/sites/all/modules/contrib/devel/devel-rtl.css +++ b/docroot/sites/all/modules/contrib/devel/devel-rtl.css @@ -1,3 +1,8 @@ +/** + * @file + * Right-to-left styles for Devel. + */ + .dev-query, .dev-timer, .dev-memory-usage { align: left; direction: ltr; @@ -5,4 +10,4 @@ } .dev-query, .dev-timer, .dev-memory-usage table { direction: ltr; -} \ No newline at end of file +} diff --git a/docroot/sites/all/modules/contrib/devel/devel.admin.inc b/docroot/sites/all/modules/contrib/devel/devel.admin.inc index 6fec2ca59..cecdb389f 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.admin.inc +++ b/docroot/sites/all/modules/contrib/devel/devel.admin.inc @@ -1,6 +1,18 @@ <?php +/** + * @file + * Functions for Devel administrative pages. + */ + +/** + * Form constructor for the settings form. + * + * @ingroup forms + */ function devel_admin_settings() { + _devel_display_block_help_message(); + $form['queries'] = array('#type' => 'fieldset', '#title' => t('Query log')); $description = t('Display a log of the database queries needed to generate the current page, and the execution time for each. Also, queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching.'); @@ -22,6 +34,12 @@ function devel_admin_settings() { ), ), ); + $form['queries']['settings']['devel_show_query_args_first'] = array( + '#type' => 'checkbox', + '#title' => t('Show query arguments'), + '#default_value' => variable_get('devel_show_query_args_first', FALSE), + '#description' => t('Show arguments rather than the query placeholders in the logged query.'), + ); $form['queries']['settings']['devel_query_sort'] = array('#type' => 'radios', '#title' => t('Sort query log'), '#default_value' => variable_get('devel_query_sort', DEVEL_QUERY_SORT_BY_SOURCE), @@ -36,57 +54,13 @@ function devel_admin_settings() { '#description' => t('Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibly inefficient query, or a candidate for caching.'), ); - $form['xhprof'] = array( - '#type' => 'fieldset', - '#title' => 'XHProf', - '#description' => t('XHProf is a php extension which is essential for profiling your Drupal site. It pinpoints slow functions, and also memory hogging functions.'), - ); - $description = extension_loaded('xhprof') ? t('Profile requests with the xhprof php extension.') : '<span class="warning">' . t('You must enable the <a href="!url">xhprof php extension</a> to use this feature.', array('!url' => url('http://techportal.ibuildings.com/2009/12/01/profiling-with-xhprof/'))) . '</span>'; - $form['xhprof']['devel_xhprof_enabled'] = array( - '#type' => 'checkbox', - '#title' => t('Enable profiling of all page views and <a href="!drush">drush</a> requests.', array('!drush' => url('http://drush.ws'))), - '#default_value' => variable_get('devel_xhprof_enabled', FALSE), - '#description' => $description, - '#disabled' => !extension_loaded('xhprof'), - ); - $form['xhprof']['settings'] = array( - '#type' => 'container', - '#states' => array( - 'invisible' => array( - 'input[name="devel_xhprof_enabled"]' => array('checked' => FALSE), - ), - ), - ); - $form['xhprof']['settings']['devel_xhprof_directory'] = array( - '#type' => 'textfield', - '#title' => 'xhprof directory', - '#description' => t('Location of the xhprof source code on your system, where the directory "xhprof_lib" can be found, usually somewhere in /usr/local/share or /usr/share, include the leading forward slash.'), - '#default_value' => variable_get('devel_xhprof_directory', ''), - '#states' => array( - 'invisible' => array( - 'input[name="devel_xhprof_enabled"]' => array('checked' => FALSE), - ), - ), - ); - $form['xhprof']['settings']['devel_xhprof_url'] = array( - '#type' => 'textfield', - '#title' => 'XHProf URL', - '#description' => t('Path to the publically accessible xhprof_html - required to display profiler reports. You will need to set this up outside Drupal, for example at http://xhprof.localhost/xhprof_html'), - '#default_value' => variable_get('devel_xhprof_url', ''), - '#states' => array( - 'invisible' => array( - 'input[name="devel_xhprof_enabled"]' => array('checked' => FALSE), - ), - ), - ); - $form['devel_api_url'] = array('#type' => 'textfield', '#title' => t('API Site'), '#default_value' => variable_get('devel_api_url', 'api.drupal.org'), '#description' => t('The base URL for your developer documentation links. You might change this if you run <a href="!url">api.module</a> locally.', array('!url' => url('http://drupal.org/project/api')))); - $form['dev_timer'] = array('#type' => 'checkbox', + $form['devel_timer'] = array('#type' => 'checkbox', '#title' => t('Display page timer'), - '#default_value' => variable_get('dev_timer', 0), + '#default_value' => variable_get('devel_timer', 0), '#description' => t('Display page execution time in the query log box.'), ); @@ -161,6 +135,45 @@ function devel_admin_settings() { return system_settings_form($form); } +/** + * Displays a helpful message if Menu module is not installed. + */ +function _devel_display_block_help_message() { + if (!module_exists('menu')) { + $devel_block_alert = t('Devel block alert: The Devel block requires the Core Menu module. The Devel block will become available once you <a href="!url">enable Menu</a>.', + array('!url' => url('admin/modules')) + ); + $variables = array( + '!admin_menu_url' => url('https://drupal.org/project/admin_menu', array('external' => TRUE)), + '!admin_menu_name' => 'Administration Menu', + '!admin_menu_config_url' => url('admin/config/administration/admin_menu'), + '!icon_menu' => t('Icon menu'), + ); + if (!module_exists('admin_menu')) { + $devel_block_alert .= '<br />' . t('Alternatively, you can install <a href="!admin_menu_url">!admin_menu_name</a> which supports displaying the Devel menu items in its !icon_menu.', $variables); + } + else { + $admin_menu_components = variable_get('admin_menu_components', array()); + if (empty($admin_menu_components['admin_menu.icon']) || !user_access('access administration menu')) { + $devel_block_alert .= '<br />' . t("Alternatively, if you <a href='!admin_menu_config_url'>enable !admin_menu_name's !icon_menu</a> you will find the Devel menu items there.", $variables); + } else { + // Don't bother with a message in the 'normal' case. + return; + } + } + drupal_set_message($devel_block_alert, 'warning'); + } +} + +/** + * Demonstrates the active error handler. + * + * Generates some warnings or errors so that the reaction of the current error + * handler can be observed. + * + * @param $severity + * The severity level that the error handler should demonstrate. + */ function devel_demonstrate_error_handlers($severity) { switch ($severity) { case 'warning': diff --git a/docroot/sites/all/modules/contrib/devel/devel.css b/docroot/sites/all/modules/contrib/devel/devel.css index 704905902..efcd90e48 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.css +++ b/docroot/sites/all/modules/contrib/devel/devel.css @@ -1,3 +1,8 @@ +/** + * @file + * Styles for elements created by Devel. + */ + .dev-query, .dev-timer, .dev-memory-usage { padding: 1em; } diff --git a/docroot/sites/all/modules/contrib/devel/devel.drush.inc b/docroot/sites/all/modules/contrib/devel/devel.drush.inc index b4d85054c..d58b7d856 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.drush.inc +++ b/docroot/sites/all/modules/contrib/devel/devel.drush.inc @@ -64,7 +64,9 @@ function devel_drush_command() { } /** - * A command callback. This is faster than 3 separate bootstraps. + * A command callback for reinstalling one or more projects. + * + * This is faster than 3 separate bootstraps. */ function drush_devel_reinstall() { $projects = func_get_args(); @@ -80,7 +82,7 @@ function drush_devel_reinstall() { } /** - * A command callback. + * A command callback for downloading a project. */ function drush_devel_download($path = NULL) { // If no path is provided by the user, set our default path. @@ -112,7 +114,7 @@ function drush_devel_download($path = NULL) { } /** - * Command handler. Show hook implementations. + * A command handler for showing hook implementations. */ function drush_devel_fn_hook($hook) { // Get implementations in the .install files as well. @@ -130,7 +132,7 @@ function drush_devel_fn_hook($hook) { } /** - * Command handler. Show source code of specified function or method. + * A command handler for showing source code of a function or method. */ function drush_devel_fn_view($function_name) { // Get implementations in the .install files as well. @@ -159,7 +161,7 @@ function drush_devel_fn_view($function_name) { } /** - * Command callback. List available tokens. + * A command callback for listing available tokens. */ function drush_devel_token() { $rows[] = array(dt('Group'), dt('Token'), dt('Name')); @@ -174,8 +176,7 @@ function drush_devel_token() { /** - * Print the specified function, including any - * doxygen-style comments that come before it. + * Prints a function including any Doxygen-style comments preceding it. */ function _drush_devel_print_function($file, $start_line, $end_line) { $line_num = 0; diff --git a/docroot/sites/all/modules/contrib/devel/devel.info b/docroot/sites/all/modules/contrib/devel/devel.info index f53d43d6b..f6defe61d 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.info +++ b/docroot/sites/all/modules/contrib/devel/devel.info @@ -7,9 +7,8 @@ tags[] = developer files[] = devel.test files[] = devel.mail.inc -; Information added by Drupal.org packaging script on 2014-05-01 -version = "7.x-1.5" +; Information added by Drupal.org packaging script on 2018-04-18 +version = "7.x-1.6" core = "7.x" project = "devel" -datestamp = "1398963366" - +datestamp = "1524009787" diff --git a/docroot/sites/all/modules/contrib/devel/devel.install b/docroot/sites/all/modules/contrib/devel/devel.install index f0828574a..d5808b7df 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.install +++ b/docroot/sites/all/modules/contrib/devel/devel.install @@ -32,7 +32,7 @@ function devel_enable() { */ function devel_uninstall() { variable_del('devel_execution'); - variable_del('dev_timer'); + variable_del('devel_timer'); variable_del('devel_query_display'); variable_del('devel_redirect_page'); variable_del('devel_api_url'); @@ -47,9 +47,6 @@ function devel_uninstall() { variable_del('devel_query_sort'); variable_del('devel_rebuild_theme_registry'); variable_del('devel_use_uncompressed_jquery'); - variable_del('devel_xhprof_directory'); - variable_del('devel_xhprof_enabled'); - variable_del('devel_xhprof_url'); variable_del('devel_debug_mail_file_format'); variable_del('devel_debug_mail_directory'); @@ -62,7 +59,9 @@ function devel_uninstall() { } /** - * Remove feature for storing queries. Cleanup deprecated tables and variables. + * Remove feature for storing queries. + * + * Cleanup deprecated tables and variables. */ function devel_update_7000() { db_drop_table('devel_queries'); @@ -81,7 +80,7 @@ function devel_update_7001() { } /** - * Remove deprecated variables - dev_query, devel_code_coverage + * Remove deprecated variables: dev_query, devel_code_coverage. */ function devel_update_7002() { variable_del('dev_query'); // Sad trombone. http://drupalcode.org/viewvc/drupal/drupal/includes/database.mysql.inc?revision=1.2&view=markup @@ -117,7 +116,9 @@ function devel_update_7004() { } /** - * Delete variable 'devel_form_weights' from database as it was removed from code. + * Delete variable 'devel_form_weights'. + * + * 'devel_form_weights' was removed from code. */ function devel_update_7005() { variable_del('devel_form_weights'); @@ -133,3 +134,23 @@ function devel_update_7006() { variable_del('dev_mem'); } + +/** + * Delete 'devel_xhprof_*' variables as they were removed from code. + */ +function devel_update_7007() { + variable_del('devel_xhprof_directory'); + variable_del('devel_xhprof_enabled'); + variable_del('devel_xhprof_url'); +} + +/** + * Change variable "dev_timer" to "devel_timer". + */ +function devel_update_7008() { + if (variable_get('dev_timer') !== NULL) { + variable_set('devel_timer', variable_get('dev_timer')); + } + + variable_del('dev_timer'); +} diff --git a/docroot/sites/all/modules/contrib/devel/devel.js b/docroot/sites/all/modules/contrib/devel/devel.js index c23cc9437..287cc4f41 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.js +++ b/docroot/sites/all/modules/contrib/devel/devel.js @@ -1,6 +1,15 @@ +/** + * @file + * Behaviors for Devel. + */ + (function ($) { -// Explain link in query log +/** + * Explain link in query log. + * + * @type {Drupal~behavior} + */ Drupal.behaviors.devel_explain = { attach: function(context, settings) { $('a.dev-explain').click(function () { @@ -14,7 +23,11 @@ Drupal.behaviors.devel_explain = { } } -// Arguments link in query log +/** + * Arguments link in query log. + * + * @type {Drupal~behavior} + */ Drupal.behaviors.devel_arguments = { attach: function(context, settings) { $('a.dev-arguments').click(function () { @@ -28,7 +41,11 @@ Drupal.behaviors.devel_arguments = { } } -// Placeholders link in query log +/** + * Placeholders link in query log. + * + * @type {Drupal~behavior} + */ Drupal.behaviors.devel_placeholders = { attach: function(context, settings) { $('a.dev-placeholders').click(function () { diff --git a/docroot/sites/all/modules/contrib/devel/devel.mail.inc b/docroot/sites/all/modules/contrib/devel/devel.mail.inc index d6f9ad537..5708e713a 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.mail.inc +++ b/docroot/sites/all/modules/contrib/devel/devel.mail.inc @@ -1,4 +1,5 @@ <?php + /** * @file * MailSystemInterface for logging mails to the filesystem. @@ -16,8 +17,20 @@ * */ +/** + * Logs mail messages to the filesystem. + */ class DevelMailLog extends DefaultMailSystem { + /** + * Converts a message array to a string. + * + * @param $message + * The message array containing the body and headers. + * + * @return + * The message as it will be printed in the file. + */ public function composeMessage($message) { $mimeheaders = array(); $message['headers']['To'] = $message['to']; @@ -35,6 +48,15 @@ class DevelMailLog extends DefaultMailSystem { return $output; } + /** + * Gets a filename for a message using tokens. + * + * @param $message + * The message that will supply values for token replacement. + * + * @return + * The full path and filename after token replacement. + */ public function getFileName($message) { $output_directory = $this->getOutputDirectory(); $this->makeOutputDirectory($output_directory); @@ -48,19 +70,26 @@ class DevelMailLog extends DefaultMailSystem { return $output_directory . '/' . $this->dirify(str_replace(array_keys($tokens), array_values($tokens), $output_file_format)); } + /** + * Convert a string to a valid directory name. + * + * @return + * The sanitized string, replacing any characters not whitelisted with "_". + */ private function dirify($string) { return preg_replace('/[^a-zA-Z0-9_\-\.@]/', '_', $string); } + /** - * Save an e-mail message to a file, using Drupal variables and default settings. - * - * @see http://php.net/manual/en/function.mail.php - * @see drupal_mail() + * Save a mail message to a file using Drupal variables and default settings. * * @param $message * A message array, as described in hook_mail_alter(). * @return * TRUE if the mail was successfully accepted, otherwise FALSE. + * + * @see http://php.net/manual/en/function.mail.php + * @see drupal_mail() */ public function mail(array $message) { $output = $this->composeMessage($message); @@ -69,14 +98,25 @@ class DevelMailLog extends DefaultMailSystem { return file_put_contents($output_file, $output); } + /** + * Creates the directory to contain the message file if necessary. + * + * @throws Exception + * Exception thrown when unable to create the destination directory. + */ protected function makeOutputDirectory($output_directory) { if (!file_prepare_directory($output_directory, FILE_CREATE_DIRECTORY)) { throw new Exception("Unable to continue sending mail, $output_directory is not writable"); } } + /** + * Retrieves the directory that contains message files. + * + * @return + * The path to mail messages, possibly using a file URI scheme. + */ public function getOutputDirectory() { return variable_get('devel_debug_mail_directory', 'temporary://devel-mails'); } } -?> diff --git a/docroot/sites/all/modules/contrib/devel/devel.module b/docroot/sites/all/modules/contrib/devel/devel.module index 624ac7d37..719088d65 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.module +++ b/docroot/sites/all/modules/contrib/devel/devel.module @@ -3,6 +3,7 @@ /** * @file * This module holds functions useful for Drupal development. + * * Please contribute! */ @@ -212,7 +213,7 @@ function devel_menu() { // Duplicate path in 2 different menus. See http://drupal.org/node/601788. $items['devel/settings'] = array( 'title' => 'Devel settings', - 'description' => 'Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the <a href="' . url('admin/structure/block') . '">block administration</a> page.', + 'description' => 'Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the <a href="/admin/structure/block">block administration</a> page.', 'page callback' => 'drupal_get_form', 'page arguments' => array('devel_admin_settings'), 'access arguments' => array('administer site configuration'), @@ -221,7 +222,7 @@ function devel_menu() { ); $items['admin/config/development/devel'] = array( 'title' => 'Devel settings', - 'description' => 'Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the <a href="' . url('admin/structure/block') . '">block administration</a> page.', + 'description' => 'Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the <a href="/admin/structure/block">block administration</a> page.', 'page callback' => 'drupal_get_form', 'page arguments' => array('devel_admin_settings'), 'file' => 'devel.admin.inc', @@ -321,11 +322,11 @@ function devel_menu() { } /** - * Menu item access callback - check permission and token for Switch User. + * Menu item access callback: checks permission and token for Switch User. */ function _devel_switch_user_access($name) { // Suppress notices when on other pages when menu system still checks access. - return user_access('switch users') && drupal_valid_token(@$_GET['token'], "devel/switch/$name|" . @$_GET['destination'], TRUE); + return user_access('switch users') && drupal_valid_token(@$_GET['token'], "devel/switch/$name", TRUE); } /** @@ -347,7 +348,7 @@ function devel_admin_paths() { } /** - * Returns destinations. + * Returns paths that need a destination. */ function devel_menu_need_destination() { return array('devel/cache/clear', 'devel/reinstall', 'devel/menu/reset', @@ -359,9 +360,9 @@ function devel_menu_need_destination() { * * Flag this link as needing alter at display time. * This is more robust than setting alter in hook_menu(). - * @see devel_translated_menu_link_alter() * - **/ + * @see devel_translated_menu_link_alter() + */ function devel_menu_link_alter(&$item) { if (in_array($item['link_path'], devel_menu_need_destination()) || $item['link_path'] == 'devel/menu/item') { $item['options']['alter'] = TRUE; @@ -372,7 +373,7 @@ function devel_menu_link_alter(&$item) { * Implements hook_translated_menu_item_alter(). * * Append dynamic querystring 'destination' to several of our own menu items. - **/ + */ function devel_translated_menu_link_alter(&$item) { if (in_array($item['href'], devel_menu_need_destination())) { $item['localized_options']['query'] = drupal_get_destination(); @@ -447,27 +448,41 @@ function devel_init() { if (flood_is_allowed('devel_rebuild_registry_warning', 1)) { flood_register_event('devel_rebuild_registry_warning'); if (!devel_silent() && user_access('access devel information')) { - drupal_set_message(t('The theme registry is being rebuilt on every request. Remember to <a href="!url">turn off</a> this feature on production websites.', array("!url" => url('admin/config/development/devel')))); + drupal_set_message(t('The theme registry is being rebuilt on every request. Remember to <a href="!url">turn off</a> this feature on production websites.', array( + "!url" => url('admin/config/development/devel', array( + 'fragment' => 'edit-devel-rebuild-theme-registry', + )), + ))); } } } } /** - * Sets message. + * Sets a message. */ function devel_set_message($msg, $type = NULL) { $function = function_exists('drush_log') ? 'drush_log' : 'drupal_set_message'; $function($msg, $type); - } +} /** - * Returns boolean. No need for cache here. + * Determines if Krumo is available. + * + * No need for cache here. + * + * @return boolean + * TRUE if Krumo is available, FALSE otherwise. */ function has_krumo() { @include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'devel') . '/krumo/class.krumo.php'; if (function_exists('krumo') && !drupal_is_cli()) { - drupal_add_js(drupal_get_path('module', 'devel') . '/devel_krumo_path.js'); + drupal_add_js(drupal_get_path('module', 'devel') . '/devel_krumo.js'); + drupal_add_css(drupal_get_path('module', 'devel') . '/devel_krumo.css'); + // If dpm() is called after status messages have been rendered they will + // instead appear on the next page load, so ensure the krumo CSS and + // Javascript files are included. + krumo::addCssJs(); return TRUE; } return FALSE; @@ -480,13 +495,17 @@ function has_krumo() { * The value to check. * * @return boolean + * TRUE if the input complex enough and Krumo is available and not disabled, + * FALSE otherwise. */ function merits_krumo($input) { return (is_object($input) || is_array($input)) && has_krumo() && variable_get('devel_krumo_skin', '') != 'disabled'; } /** - * Calls the http://www.firephp.org/ fb() function if it is found. + * Calls the fb() function if it is found. + * + * @see http://www.firephp.org/ */ function dfb() { if (function_exists('fb') && user_access('access devel information') && !headers_sent()) { @@ -555,6 +574,8 @@ function devel_watchdog(array $log_entry) { /** * Gets error handlers. + * + * @return array */ function devel_get_handlers() { $error_handlers = variable_get('devel_error_handlers', array(DEVEL_ERROR_HANDLER_STANDARD => DEVEL_ERROR_HANDLER_STANDARD)); @@ -566,6 +587,10 @@ function devel_get_handlers() { /** * Sets a new error handler or restores the prior one. + * + * @param array $handlers + * An array of error handlers to set. Use an empty array to restore the + * previous one. */ function devel_set_handler($handlers) { if (empty($handlers)) { @@ -583,6 +608,8 @@ function devel_set_handler($handlers) { /** * Checks whether Devel may be active. + * + * @return boolean */ function devel_silent() { // isset($_GET['q']) is needed when calling the front page. q is not set. @@ -601,36 +628,12 @@ function devel_silent() { ); } -/** - * Enables xhprof. - */ -function devel_xhprof_enable() { - if (devel_xhprof_is_enabled()) { - if ($path = variable_get('devel_xhprof_directory', '')) { - include_once $path . '/xhprof_lib/utils/xhprof_lib.php'; - include_once $path . '/xhprof_lib/utils/xhprof_runs.php'; - // @todo: consider a variable per-flag instead. - xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); - } - } -} - -/** - * Checks if xhprof is enabled. - */ -function devel_xhprof_is_enabled() { - return extension_loaded('xhprof') && variable_get('devel_xhprof_enabled', FALSE); -} - /** * Implements hook_boot(). * * Runs even for cached pages. */ function devel_boot() { - // Initialize XHProf. - devel_xhprof_enable(); - if (!devel_silent()) { if (variable_get('devel_memory', 0)) { global $memory_init; @@ -847,6 +850,9 @@ function devel_block_view($delta) { /** * Provides the Switch user block. + * + * @return array + * A render array containing the Switch user block. */ function devel_block_switch_user() { $links = devel_switch_user_list(); @@ -864,6 +870,9 @@ function devel_block_switch_user() { /** * Provides the Switch user list. + * + * @return array + * An array of links, each of which can be used to switch to a user. */ function devel_switch_user_list() { global $user; @@ -905,7 +914,7 @@ function devel_switch_user_list() { $links[$account->uid] = array( 'title' => drupal_placeholder(format_username($account)), 'href' => $path, - 'query' => $dest + array('token' => drupal_get_token($path . '|' . $dest['destination'])), + 'query' => $dest + array('token' => drupal_get_token($path)), 'attributes' => array('title' => t('This user can switch back.')), 'html' => TRUE, 'last_access' => $account->access, @@ -921,7 +930,7 @@ function devel_switch_user_list() { $links[$account->uid] = array( 'title' => format_username($account), 'href' => $path, - 'query' => $dest + array('token' => drupal_get_token($path . '|' . $dest['destination'])), + 'query' => array('token' => drupal_get_token($path)), 'attributes' => array('title' => t('Caution: this user will be unable to switch back.')), 'last_access' => $account->access, ); @@ -933,7 +942,7 @@ function devel_switch_user_list() { $link = array( 'title' => format_username(drupal_anonymous_user()), 'href' => $path, - 'query' => $dest + array('token' => drupal_get_token($path . '/|' . $dest['destination'])), + 'query' => $dest + array('token' => drupal_get_token($path)), 'attributes' => array('title' => t('Caution: the anonymous user will be unable to switch back.')), ); if (user_access('switch users', drupal_anonymous_user())) { @@ -970,7 +979,8 @@ function devel_switch_user_form() { '#maxlength' => USERNAME_MAX_LENGTH, '#size' => 16, ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Switch'), ); @@ -990,7 +1000,8 @@ function devel_doc_function_form() { '#maxlength' => 255, ); $form['version'] = array('#type' => 'value', '#value' => $version); - $form['submit_button'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); @@ -1026,8 +1037,10 @@ function devel_switch_user_form_submit($form, &$form_state) { array( 'query' => array( 'destination' => '', - 'token' => drupal_get_token($path . '|'), - ))); + 'token' => drupal_get_token($path), + ), + ), + ); } /** @@ -1085,12 +1098,6 @@ function devel_shutdown() { // Register the real shutdown function so it runs after other shutdown // functions. drupal_register_shutdown_function('devel_shutdown_real'); - - global $devel_run_id; - $devel_run_id = devel_xhprof_is_enabled() ? devel_shutdown_xhprof() : NULL; - if ($devel_run_id && function_exists('drush_log')) { - drush_log('xhprof link: ' . devel_xhprof_link($devel_run_id, 'url'), 'notice'); - } } /** @@ -1126,7 +1133,7 @@ function devel_shutdown_real() { // Set $GLOBALS['devel_shutdown'] = FALSE in order to supress the // devel footer for a page. Not necessary if your page outputs any // of the Content-type http headers tested below (e.g. text/xml, - // text/javascript, etc). This is is advised where applicable. + // text/javascript, etc). This is advised where applicable. if (!devel_silent() && !isset($GLOBALS['devel_shutdown']) && !isset($GLOBALS['devel_redirecting'])) { // Try not to break non html pages. if (function_exists('drupal_get_http_header')) { @@ -1144,6 +1151,12 @@ function devel_shutdown_real() { if (isset($user) && user_access('access devel information')) { $queries = (devel_query_enabled() ? Database::getLog('devel', 'default') : NULL); + if (!empty($queries)) { + // Remove caller args to avoid recursion. + foreach ($queries as &$query) { + unset($query['caller']['args']); + } + } $output .= devel_shutdown_summary($queries); $output .= devel_shutdown_query($queries); } @@ -1160,6 +1173,8 @@ function devel_shutdown_real() { /** * Returns the rendered shutdown summary. + * + * @return string */ function devel_shutdown_summary($queries) { $sum = 0; @@ -1172,14 +1187,10 @@ function devel_shutdown_summary($queries) { $output .= t_safe(' Queries exceeding @threshold ms are <span class="marker">highlighted</span>.', array('@threshold' => variable_get('devel_execution', 5))); } - if (variable_get('dev_timer', 0)) { + if (variable_get('devel_timer', 0)) { $output .= devel_timer(); } - if (devel_xhprof_is_enabled()) { - $output .= ' ' . devel_xhprof_link($GLOBALS['devel_run_id']); - } - $output .= devel_shutdown_memory(); if ($output) { @@ -1187,33 +1198,10 @@ function devel_shutdown_summary($queries) { } } -/** - * Returns the XHProf run ID. - */ -function devel_shutdown_xhprof() { - // Namespace for your application. - $namespace = variable_get('site_name', ''); - $xhprof_data = xhprof_disable(); - $xhprof_runs = new XHProfRuns_Default(); - return $xhprof_runs->save_run($xhprof_data, $namespace); -} - -/** - * Returns the XHProf link. - */ -function devel_xhprof_link($run_id, $type = 'link') { - // @todo: render results from within Drupal. - $xhprof_url = variable_get('devel_xhprof_url', ''); - // Namespace for your application. - $namespace = variable_get('site_name', ''); - if ($xhprof_url) { - $url = $xhprof_url . '/index.php?run=' . urlencode($run_id) . '&source=' . urlencode($namespace); - return $type == 'url' ? $url : t('<a href="@xhprof">XHProf output</a>. ', array('@xhprof' => $url)); - } -} - /** * Returns the rendered memory usage. + * + * @return string */ function devel_shutdown_memory() { global $memory_init; @@ -1233,6 +1221,8 @@ function devel_shutdown_memory() { /** * Returns the rendered query log. + * + * @return string */ function devel_shutdown_query($queries) { if (!empty($queries)) { @@ -1282,6 +1272,9 @@ function devel_query_put_contents($queries) { /** * Returns whether query logging is enabled. + * + * @return boolean + * TRUE if the query log is enabled, FALSE otherwise. */ function devel_query_enabled() { return method_exists('Database', 'getLog') && variable_get('devel_query_display', FALSE); @@ -1289,6 +1282,14 @@ function devel_query_enabled() { /** * Returns the query summary. + * + * @return array + * An index array containing: + * 0: The an associative array where the keys are the queries and the values + * are number of times that query was executes. + * 1: The summary. + * 2: An associative array of substitution variables to be applied in the + * previous element. */ function devel_query_summary($queries) { if (variable_get('devel_query_display', FALSE) && is_array($queries)) { @@ -1307,7 +1308,7 @@ function devel_query_summary($queries) { } /** - * Devel's t_safe() function. + * Gets the t() function if available, uses strtr() as a fallback. */ function t_safe($string, $args) { // get_t() caused problems here with the theme registry after changing on @@ -1317,12 +1318,18 @@ function t_safe($string, $args) { return t($string, $args); } else { - strtr($string, $args); + return strtr($string, $args); } } /** * Returns the core version. + * + * @param string + * The version string to parse. + * + * @return string + * MAJOR.MINOR for versions before 5, MAJOR for subsequent versions. */ function devel_get_core_version($version) { $version_parts = explode('.', $version); @@ -1338,6 +1345,9 @@ function devel_get_core_version($version) { /** * Returns whether the optimizer is compatible. + * + * @return boolean + * TRUE if compatible, FALSE otherwise. */ function devel_is_compatible_optimizer() { // See http://drupal.org/node/126098. @@ -1399,7 +1409,11 @@ function devel_execute_form() { '#default_value' => (isset($_SESSION['devel_execute_code']) ? $_SESSION['devel_execute_code'] : ''), '#rows' => 20, ); - $form['execute']['op'] = array('#type' => 'submit', '#value' => t('Execute')); + $form['execute']['actions'] = array('#type' => 'actions'); + $form['execute']['actions']['op'] = array( + '#type' => 'submit', + '#value' => t('Execute'), + ); $form['#redirect'] = FALSE; if (isset($_SESSION['devel_execute_code'])) { unset($_SESSION['devel_execute_code']); @@ -1456,6 +1470,9 @@ function devel_switch_user($name = NULL) { * An array or object to print. * @param string $prefix * Prefix for output items. + * + * @return + * The results from krumo_ob() or devel_print_object(). */ function kdevel_print_object($object, $prefix = NULL) { return has_krumo() ? krumo_ob($object) : devel_print_object($object, $prefix); @@ -1481,6 +1498,8 @@ function krumo_ob($object) { * Prefix for the output items (example "$node->", "$user->", "$"). * @param boolean $header * Set to FALSE to suppress the output of the h3 tag. + * + * @return string */ function devel_print_object($object, $prefix = NULL, $header = TRUE) { drupal_add_css(drupal_get_path('module', 'devel') . '/devel.css'); @@ -1516,7 +1535,7 @@ function devel_print_object($object, $prefix = NULL, $header = TRUE) { * Formatted html. * * @todo - * currently there are problems sending an array with a varname + * Currently there are problems sending an array with a varname. */ function _devel_print_object($obj, $prefix = NULL, $parents = NULL, $object = FALSE) { static $root_type, $out_format; @@ -1623,12 +1642,16 @@ function _devel_print_object($obj, $prefix = NULL, $parents = NULL, $object = FA * * Adds a table at the bottom of the page cataloguing data on all the database * queries that were made to generate the page. + * + * @return string + * Queries themed using devel_querylog. */ function devel_query_table($queries, $counts) { $version = devel_get_core_version(VERSION); $header = array('ms', '#', 'where', 'ops', 'query', 'target'); $i = 0; $api = variable_get('devel_api_url', 'api.drupal.org'); + $conn = Database::getconnection(); foreach ($queries as $query) { $function = !empty($query['caller']['class']) ? $query['caller']['class'] . '::' : ''; $function .= $query['caller']['function']; @@ -1666,8 +1689,19 @@ function devel_query_table($queries, $counts) { } $cell[$i][] = implode(' ', $ops); // 3 divs for each variation of the query. Last 2 are hidden by default. - $placeholders = '<div class="dev-placeholders">' . check_plain($query['query']) . "</div>\n"; - $args = '<div class="dev-arguments" style="display: none;"></div>' . "\n"; + if (variable_get('devel_show_query_args_first', FALSE)) { + $placeholders = '<div class="dev-placeholders" style="display: none;">' . check_plain($query['query']) . "</div>\n"; + $quoted = array(); + foreach ($query['args'] as $key => $val) { + $quoted[$key] = $conn->quote($val); + } + $output = strtr($query['query'], $quoted); + $args = '<div class="dev-arguments">' . $output . '</div>' . "\n"; + } + else { + $placeholders = '<div class="dev-placeholders">' . check_plain($query['query']) . "</div>\n"; + $args = '<div class="dev-arguments" style="display: none;"></div>' . "\n"; + } $explain = '<div class="dev-explain" style="display: none;"></div>' . "\n"; $cell[$i][] = array( 'id' => "devel-query-$i", @@ -1684,7 +1718,16 @@ function devel_query_table($queries, $counts) { } /** - * Themes devel's querylog row. + * Returns HTML for a Devel querylog row. + * + * @param array $variables + * An associative array containing: + * - row: An array of cells in which each cell is either a string or an + * associative array containing: + * - data: The data to render. + * - Any attributes to be applied to the cell. + * + * @ingroup themeable */ function theme_devel_querylog_row($variables) { $row = $variables['row']; @@ -1717,7 +1760,14 @@ function theme_devel_querylog_row($variables) { } /** - * Themes devel's querylog. + * Returns HTML for the Devel querylog. + * + * @param array $variables + * An associative array containing: + * - header: An array suitable for rendering with devel_querylog_row. + * - rows: An array of rows suitable for rendering with devel_querylog_row. + * + * @ingroup themeable */ function theme_devel_querylog($variables) { $header = $variables['header']; @@ -1758,17 +1808,24 @@ function _devel_table_sort($a, $b) { /** * Displays page execution time at the bottom of the page. + * + * @return string + * A message indicating how long it took to execute the page. */ function devel_timer() { $time = timer_read('page'); return t_safe(' Page execution time was @time ms.', array('@time' => $time)); } -/** - * An alias for drupal_debug(). - */ -function dd($data, $label = NULL) { - return drupal_debug($data, $label); +if (!function_exists('dd')) { + /** + * An alias for drupal_debug(). + * + * @see drupal_debug() + */ + function dd($data, $label = NULL) { + return drupal_debug($data, $label); + } } /** @@ -1809,7 +1866,7 @@ function dargs($always = TRUE) { } /** - * Prints a SQL string from a DBTNG Select object. Includes quoted arguments. + * Prints a SQL string from a DBTNG Select object. * * Includes quoted arguments. * @@ -1820,6 +1877,7 @@ function dargs($always = TRUE) { * and return $query instead. * @param string $name * Optional name for identifying the output. + * * @return object|string * The $query object, or the query string if $return was TRUE. */ @@ -1857,6 +1915,8 @@ function dpq($query, $return = FALSE, $name = NULL) { * * @return input * The unaltered input value. + * + * @see drupal_set_message() */ function dpm($input, $name = NULL, $type = 'status') { if (user_access('access devel information')) { @@ -1878,6 +1938,9 @@ function dpm($input, $name = NULL, $type = 'status') { * * @return input * The unaltered input value. + * + * @see drupal_set_message() + * @see drupal_var_export() */ function dvm($input, $name = NULL) { if (user_access('access devel information')) { @@ -1890,21 +1953,31 @@ function dvm($input, $name = NULL) { /** * Legacy function that was poorly named. * - * Use dpm() instead, since the 'p' maps to 'print_r'. + * @deprecated Use dpm() instead, since the 'p' maps to 'print_r'. + * + * @see dpm() */ function dsm($input, $name = NULL) { return dpm($input, $name); } /** - * An alias for dprint_r(). Saves carpal tunnel syndrome. + * An alias for dprint_r(). + * + * Saves carpal tunnel syndrome. + * + * @see dprint_r() */ function dpr($input, $return = FALSE, $name = NULL) { return dprint_r($input, $return, $name); } /** - * An alias for kprint_r(). Saves carpal tunnel syndrome. + * An alias for kprint_r(). + * + * Saves carpal tunnel syndrome. + * + * @see kprint_r() */ function kpr($input, $return = FALSE, $name = NULL) { return kprint_r($input, $return, $name); @@ -1912,13 +1985,32 @@ function kpr($input, $return = FALSE, $name = NULL) { /** * Like dpr(), but uses drupal_var_export() instead. + * + * @see dprint_r() + * @see drupal_var_export() */ function dvr($input, $return = FALSE, $name = NULL) { return dprint_r($input, $return, $name, 'drupal_var_export', FALSE); } /** - * Krumo print. + * Returns a message using Krumo. + * + * Uses dprint_r() as a fallback. + * + * @param mixed $input + * The thing to print. + * @param boolean $return + * (optional) Indicates if the output should be returned. The default is + * FALSE. + * @param string $name + * (optional) The label to apply. + * @param string $function + * (optional) The function to use for output in the case where dprint_r() is + * used. The defualt is print_r(). + * + * @return + * The output if $return is TRUE. */ function kprint_r($input, $return = FALSE, $name = NULL, $function = 'print_r') { // We do not want to krumo() strings and integers and such. @@ -1935,10 +2027,26 @@ function kprint_r($input, $return = FALSE, $name = NULL, $function = 'print_r') /** * Pretty-print a variable to the browser (no krumo). * - * Displays only for users with proper permissions. If - * you want a string returned instead of a print, use the 2nd param. + * Displays only for users with proper permissions. If you want a string + * returned instead of a print, use the 2nd param. + * + * @param mixed $input + * The input that should be printed or returned. + * @param boolean $return + * (optional) Indicates of the result should be returned instead of printed. + * The default is to print it. + * @param string $name + * (optional) The label to apply. + * @param string $function + * (optional) The function to use for output. The defualt is print_r(). + * @param boolean $check + * (optional) Indicates if the output should be run through check_plain(). + * The default is TRUE. + * + * @return + * The formatted output if $return is TRUE. */ -function dprint_r($input, $return = FALSE, $name = NULL, $function = 'print_r', $check= TRUE) { +function dprint_r($input, $return = FALSE, $name = NULL, $function = 'print_r', $check = TRUE) { if (user_access('access devel information')) { if ($name) { $name .= ' => '; @@ -1956,7 +2064,7 @@ function dprint_r($input, $return = FALSE, $name = NULL, $function = 'print_r', if ($check) { $output = check_plain($output); } - if (count($input, COUNT_RECURSIVE) > DEVEL_MIN_TEXTAREA) { + if (is_array($input) && count($input, COUNT_RECURSIVE) > DEVEL_MIN_TEXTAREA) { // Don't use fapi here because sometimes fapi will not be loaded. $printed_value = "<textarea rows=30 style=\"width: 100%;\">\n" . $name . $output . '</textarea>'; } @@ -2014,9 +2122,11 @@ function ddebug_backtrace($return = FALSE, $pop = 0, $options = TRUE) { array_shift($backtrace); } $counter = count($backtrace); - $path = $backtrace[$counter - 1]['file']; - $path = substr($path, 0, strlen($path) - 10); - $paths[$path] = strlen($path) + 1; + if (!empty($backtrace[$counter - 1]['file'])) { + $path = $backtrace[$counter - 1]['file']; + $path = substr($path, 0, strlen($path) - 10); + $paths[$path] = strlen($path) + 1; + } $paths[DRUPAL_ROOT] = strlen(DRUPAL_ROOT) + 1; $nbsp = "\xC2\xA0"; @@ -2078,9 +2188,8 @@ function devel_empty_dir($dir) { /** * Regenerates the data in node_comment_statistics table. - * Technique - http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#101 * - * @return void + * Technique - http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#101 */ function devel_rebuild_node_comment_statistics() { // Empty table. @@ -2115,8 +2224,8 @@ function devel_rebuild_node_comment_statistics() { /** * Implements hook_form_alter(). * - * Adds mouse-over hints on the Permissions page to display - * language-independent machine names and module base names. + * Adds mouse-over hints on the Permissions page to display language-independent + * machine names and module base names. */ function devel_form_user_admin_permissions_alter(&$form, &$form_state) { if (user_access('access devel information') && variable_get('devel_raw_names', FALSE)) { @@ -2152,3 +2261,25 @@ function devel_form_system_modules_alter(&$form, &$form_state) { } } } + +/** + * Implements hook_query_TAG_alter() for the devel tag. + * + * Makes debugging EntityFieldQuery much easier. + * + * Example usage: + * @code + * $q = new EntityFieldQuery; + * $q->entityCondition('entity_type', 'node') + * ->addTag('debug') + * ->execute(); + * @endcode + * + * @param QueryAlterableInterface $query + */ +function devel_query_debug_alter(QueryAlterableInterface $query) { + if (!$query->hasTag('debug-semaphore')) { + $query->addTag('debug-semaphore'); + dpq($query); + } +} diff --git a/docroot/sites/all/modules/contrib/devel/devel.pages.inc b/docroot/sites/all/modules/contrib/devel/devel.pages.inc index 7a137da3c..f24777fe3 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.pages.inc +++ b/docroot/sites/all/modules/contrib/devel/devel.pages.inc @@ -1,14 +1,23 @@ <?php -// Menu callback that shows menu item. +/** + * @file + * Page callbacks for Devel. + */ + +/** + * Page callback: Shows a menu item. + */ function devel_menu_item() { $item = menu_get_item($_GET['path']); return kdevel_print_object($item); } /** - * Returns a list of all currently defined user functions in the current - * request lifecycle, with links their documentation. + * Page callback: Returns a list of all currently defined user functions. + * + * Returns a list of all currently defined user functions in the current request + * lifecycle, with links their documentation. */ function devel_function_reference() { $functions = get_defined_functions(); @@ -23,7 +32,7 @@ function devel_function_reference() { } /** - * Menu callback; clears all caches, then redirects to the previous page. + * Page callback: Clears all caches, then redirects to the previous page. */ function devel_cache_clear() { drupal_flush_all_caches(); @@ -33,7 +42,9 @@ function devel_cache_clear() { drupal_goto(); } -// A menu callback. Called by the AJAX link in query log. +/** + * Page callback: Called by the AJAX link in query log. + */ function devel_querylog_explain($request_id, $qid) { if (!is_numeric($request_id)) { return MENU_ACCESS_DENIED; @@ -41,25 +52,39 @@ function devel_querylog_explain($request_id, $qid) { $path = "temporary://devel_querylog/$request_id.txt"; $path = file_stream_wrapper_uri_normalize($path); - $queries = json_decode(file_get_contents($path)); - $query = $queries[$qid]; - $result = db_query('EXPLAIN ' . $query->query, (array)$query->args)->fetchAllAssoc('table'); - $i = 1; - foreach ($result as $row) { - $row = (array)$row; - if ($i == 1) { - $header = array_keys($row); + + $output = t('No explain log found.'); + + if (file_exists($path)) { + $queries = json_decode(file_get_contents($path)); + + if ($queries !== FALSE && isset($queries[$qid])) { + $header = $rows = array(); + + $query = $queries[$qid]; + $result = db_query('EXPLAIN ' . $query->query, (array)$query->args)->fetchAllAssoc('table'); + $i = 1; + foreach ($result as $row) { + $row = (array)$row; + if ($i == 1) { + $header = array_keys($row); + } + $rows[] = array_values($row); + $i++; + } + + $output = theme('table', array('header' => $header, 'rows' => $rows)); } - $rows[] = array_values($row); - $i++; } + // Print and return nothing thus avoiding page wrapper. - $output = theme('table', array('header' => $header, 'rows' => $rows)); print $output; $GLOBALS['devel_shutdown'] = FALSE; } -// A menu callback. Called by the AJAX link in query log. +/** + * Page callback: Called by the AJAX link in query log. + */ function devel_querylog_arguments($request_id, $qid) { if (!is_numeric($request_id)) { return MENU_ACCESS_DENIED; @@ -67,22 +92,30 @@ function devel_querylog_arguments($request_id, $qid) { $path = "temporary://devel_querylog/$request_id.txt"; $path = file_stream_wrapper_uri_normalize($path); - $queries = json_decode(file_get_contents($path)); - $query = $queries[$qid]; - $conn = Database::getConnection(); - $quoted = array(); - foreach ((array)$query->args as $key => $val) { - $quoted[$key] = $conn->quote($val); + + $output = t('No arguments log found.'); + + if (file_exists($path)) { + $queries = json_decode(file_get_contents($path)); + + if ($queries !== FALSE && isset($queries[$qid])) { + $query = $queries[$qid]; + $conn = Database::getConnection(); + $quoted = array(); + foreach ((array)$query->args as $key => $val) { + $quoted[$key] = $conn->quote($val); + } + $output = strtr($query->query, $quoted); + } } - $output = strtr($query->query, $quoted); - // print and return nothing thus avoiding page wrapper. + // Print and return nothing thus avoiding page wrapper. print $output; $GLOBALS['devel_shutdown'] = FALSE; } /** - * Menu callback; clear the database, resetting the menu to factory defaults. + * Page callback: Clears the database, resetting the menu to factory defaults. */ function devel_menu_rebuild() { menu_rebuild(); @@ -91,7 +124,11 @@ function devel_menu_rebuild() { } /** - * Display a dropdown of installed modules with the option to reinstall them. + * Form constructor for reinstalling any module from a dropdown. + * + * @see devel_reinstall_submit() + * + * @ingroup forms */ function devel_reinstall($form, &$form_state) { $output = ''; @@ -103,7 +140,8 @@ function devel_reinstall($form, &$form_state) { '#options' => $options, '#description' => t('Uninstall and then install the selected modules. <code>hook_uninstall()</code> and <code>hook_install()</code> will be executed and the schema version number will be set to the most recent update number. You may have to manually clear out any existing tables first if the module doesn\'t implement <code>hook_uninstall()</code>.'), ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#value' => t('Reinstall'), '#type' => 'submit', ); @@ -111,7 +149,7 @@ function devel_reinstall($form, &$form_state) { } /** - * Process reinstall menu form submissions. + * Form submission callback for devel_reinstall(). */ function devel_reinstall_submit($form, &$form_state) { // require_once './includes/install.inc'; @@ -122,7 +160,9 @@ function devel_reinstall_submit($form, &$form_state) { drupal_set_message(t('Uninstalled and installed: %names.', array('%names' => implode(', ', $modules)))); } -// Menu callback. +/** + * Page callback: Rebuilds the theme registry. + */ function devel_theme_registry() { drupal_theme_initialize(); $hooks = theme_get_registry(); @@ -130,14 +170,26 @@ function devel_theme_registry() { return kprint_r($hooks, TRUE); } -// Menu callback. $entity_type argument not currently used in the UI. +/** + * Page callback: Returns information from hook_entity_info(). + * + * @param string $entity_type + * (optional) Limit results to the specified entity type. The default is to + * return information about all entity types. The $entity_type argument is not + * currently used in the UI. + * + * @return + * The results from kprint_r(). + */ function devel_entity_info_page($entity_type = NULL) { $info = entity_get_info($entity_type); ksort($info); return kprint_r($info, TRUE); } -// Menu callback. +/** + * Page callback: Returns information about fields. + */ function devel_field_info_page() { $info = field_info_fields(); $output = kprint_r($info, TRUE, t('Fields')); @@ -156,6 +208,13 @@ function devel_field_info_page() { return $output; } +/** + * Form constructor for displaying and editing variables. + * + * @see devel_variable_form_submit() + * + * @ingroup forms. + */ function devel_variable_form() { $header = array( 'name' => array('data' => t('Name'), 'field' => 'name', 'sort' => 'asc'), @@ -163,7 +222,9 @@ function devel_variable_form() { 'length' => array('data' => t('Length'), 'field' => 'length'), 'edit' => array('data' => t('Operations')), ); - // TODO: we could get variables out of $conf but that would include hard coded ones too. ideally i would highlight overrridden/hard coded variables + // @todo: We could get variables out of $conf but that would include + // hard-coded ones too. Ideally I would highlight overridden/hard-coded + // variables. $query = db_select('variable', 'v')->extend('TableSort'); $query->fields('v', array('name', 'value')); switch (db_driver()) { @@ -202,15 +263,20 @@ function devel_variable_form() { '#options' => $options, '#empty' => t('No variables.'), ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Delete'), ); + $form['#after_build'][] = 'devel_variable_form_after_build'; // krumo($form); return $form; } +/** + * Form submission handler for devel_variable_form(). + */ function devel_variable_form_submit($form, &$form_state) { $deletes = array_filter($form_state['values']['variables']); array_walk($deletes, 'variable_del'); @@ -219,6 +285,25 @@ function devel_variable_form_submit($form, &$form_state) { } } +/** + * After build callback for devel_variable_form(). + * + * Wrap each variable name in a <label> element. + */ +function devel_variable_form_after_build($form, &$form_state) { + foreach ($form['variables']['#options'] as $variable => $element) { + $form['variables']['#options'][$variable]['name'] = '<label for="' . $form['variables'][$variable]['#id'] . '">' . $element['name'] . '</label>'; + } + return $form; +} + +/** + * Form constructor for editing a variable. + * + * @see devel_variable_edit_submit() + * + * @ingroup forms + */ function devel_variable_edit($form, &$form_state, $name) { $value = variable_get($name, 'not found'); $form['name'] = array( @@ -236,7 +321,8 @@ function devel_variable_edit($form, &$form_state, $name) { '#title' => t('New value'), '#default_value' => $value ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); @@ -253,6 +339,9 @@ function devel_variable_edit($form, &$form_state, $name) { return $form; } +/** + * Form submission handler for devel_variable_edit(). + */ function devel_variable_edit_submit($form, &$form_state) { variable_set($form_state['values']['name'], $form_state['values']['new']); drupal_set_message(t('Saved new value for %name.', array('%name' => $form_state['values']['name']))); @@ -260,7 +349,7 @@ function devel_variable_edit_submit($form, &$form_state) { } /** - * Menu callback: display the session. + * Page callback: Displays the session. */ function devel_session() { global $user; @@ -271,7 +360,7 @@ function devel_session() { } /** - * Menu callback; prints the loaded structure of the current node/user. + * Page callback: Prints the loaded structure of the current node/user. */ function devel_load_object($type, $object, $name = NULL) { $name = isset($name) ? $name : $type; @@ -279,19 +368,45 @@ function devel_load_object($type, $object, $name = NULL) { } /** - * Menu callback; prints the render structure of the current object (currently node or user). + * Page callback: Prints the render structure of the current object. + * + * @param string $type + * The type of entity that will be displayed. + * @param object $object + * The entity to display. + * @param string $name + * (optional) The label to use when displaying the entity. + * + * @return + * The results from kdevel_print_object(). */ function devel_render_object($type, $object, $name = NULL) { $name = isset($name) ? $name : $type; $function = $type . '_view'; - $build = $function($object); + + switch ($function) { + case 'comment_view': + $node = node_load($object->nid); + $build = $function($object, $node); + break; + + default: + $build = $function($object); + } + return kdevel_print_object($build, '$'. $name .'->'); } +/** + * Page callback: Returns information from hook_elements(). + */ function devel_elements_page() { return kdevel_print_object(module_invoke_all('element_info')); } +/** + * Page callback: Returns the results from phpinfo(). + */ function devel_phpinfo() { print phpinfo(); drupal_exit(); diff --git a/docroot/sites/all/modules/contrib/devel/devel.rules.inc b/docroot/sites/all/modules/contrib/devel/devel.rules.inc index 0a7a07808..12a79d9d9 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.rules.inc +++ b/docroot/sites/all/modules/contrib/devel/devel.rules.inc @@ -1,5 +1,10 @@ <?php +/** + * @file + * Rules integration for Devel. + */ + /** * Implements hook_rules_action_info(). */ diff --git a/docroot/sites/all/modules/contrib/devel/devel.test b/docroot/sites/all/modules/contrib/devel/devel.test index 50defcf6e..4d139f1f3 100644 --- a/docroot/sites/all/modules/contrib/devel/devel.test +++ b/docroot/sites/all/modules/contrib/devel/devel.test @@ -11,6 +11,9 @@ class DevelMailTest extends DrupalWebTestCase { protected $profile = 'testing'; + /** + * {@inheritdoc} + */ public static function getInfo() { return array( 'name' => 'Devel Mail interface', @@ -19,6 +22,9 @@ class DevelMailTest extends DrupalWebTestCase { ); } + /** + * {@inheritdoc} + */ function setUp() { parent::setUp(); } diff --git a/docroot/sites/all/modules/contrib/devel/develDrushTest.php b/docroot/sites/all/modules/contrib/devel/develDrushTest.php index 11e54ca51..cb280b78c 100644 --- a/docroot/sites/all/modules/contrib/devel/develDrushTest.php +++ b/docroot/sites/all/modules/contrib/devel/develDrushTest.php @@ -1,13 +1,26 @@ <?php -/* +/** * @file - * PHPUnit Tests for devel. This uses Drush's own test framework, based on PHPUnit. - * To run the tests, use phpunit --bootstrap=/path/to/drush/tests/drush_testcase.inc. - * Note that we are pointing to the drush_testcase.inc file under /tests subdir in drush. + * PHPUnit Tests for devel. + * + * This uses Drush's own test framework, based on PHPUnit. + * To run the tests, use + * @code + * phpunit --bootstrap=/path/to/drush/tests/drush_testcase.inc. + * @endcode + * Note that we are pointing to the drush_testcase.inc file under /tests subdir + * in drush. + */ + +/** + * Class for testing Drush integration. */ class develCase extends Drush_CommandTestCase { + /** + * Tests the printing of a function and its Doxygen comment. + */ public function testFnView() { $sites = $this->setUpDrupal(1, TRUE); $options = array( @@ -22,4 +35,4 @@ public function testFnView() { $this->assertContains('@return', $output, 'Output contain @return Doxygen.'); $this->assertContains('function drush_main() {', $output, 'Output contains function drush_main() declaration'); } -} \ No newline at end of file +} diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.inc b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.inc index 072dafe12..576446884 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.inc +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.inc @@ -270,6 +270,7 @@ function devel_generate_terms($records, $vocabs, $maxlength = 12) { $term->format = filter_fallback_format(); $term->weight = mt_rand(0, 10); $term->language = LANGUAGE_NONE; + $term->devel_generate = TRUE; // Populate all core fields on behalf of field.module module_load_include('inc', 'devel_generate', 'devel_generate.fields'); @@ -477,29 +478,11 @@ function devel_generate_word($length){ return substr($word, 0, $length); } -function devel_create_content($type = NULL) { - $nparas = mt_rand(1,12); - $type = empty($type) ? mt_rand(0,3) : $type; - - $output = ""; - switch($type % 3) { - // MW: This appears undesireable. Was giving <p> in text fields - // case 1: // html - // for ($i = 1; $i <= $nparas; $i++) { - // $output .= devel_create_para(mt_rand(10,60),1); - // } - // break; - // - // case 2: // brs only - // for ($i = 1; $i <= $nparas; $i++) { - // $output .= devel_create_para(mt_rand(10,60),2); - // } - // break; - - default: // plain text - for ($i = 1; $i <= $nparas; $i++) { - $output .= devel_create_para(mt_rand(10,60)) ."\n\n"; - } +function devel_create_content() { + $nparas = mt_rand(1, 12); + $output = ''; + for ($i = 1; $i <= $nparas; $i++) { + $output .= devel_create_para(mt_rand(10,60)) . "\n\n"; } return $output; @@ -659,8 +642,12 @@ function devel_generate_content_pre_node(&$results) { /** * Create one node. Used by both batch and non-batch code branches. * - * @param $num - * array of options obtained from devel_generate_content_form. + * @param $results + * array of options obtained from devel_generate_content_form. If call + * this function directly, $results should contain at the very least: + * node_types => an associative array of node type machine names + * users => an array of UIDs + * title_length => max number of words in titles, for example 4. */ function devel_generate_content_add_node(&$results) { $node = new stdClass(); @@ -675,7 +662,7 @@ function devel_generate_content_add_node(&$results) { $node->revision = mt_rand(0,1); $node->promote = mt_rand(0, 1); - if ($type->has_title) { + if (!$type || $type->has_title) { // We should not use the random function if the value is not random if ($results['title_length'] < 2) { $node->title = devel_create_greeking(1, TRUE); diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.info b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.info index b45159f57..841d93ac4 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.info +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.info @@ -6,9 +6,8 @@ tags[] = developer configure = admin/config/development/generate files[] = devel_generate.test -; Information added by Drupal.org packaging script on 2014-05-01 -version = "7.x-1.5" +; Information added by Drupal.org packaging script on 2018-04-18 +version = "7.x-1.6" core = "7.x" project = "devel" -datestamp = "1398963366" - +datestamp = "1524009787" diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.module b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.module index 11bc2916c..d714dbe54 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.module +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate.module @@ -91,7 +91,8 @@ function devel_generate_users_form() { '#default_value' => 604800, ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Generate'), ); @@ -225,7 +226,8 @@ function devel_generate_content_form() { '#default_value' => array(LANGUAGE_NONE), ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Generate'), ); @@ -292,7 +294,8 @@ function devel_generate_term_form() { '#title' => t('Delete existing terms in specified vocabularies before generating new terms.'), '#default_value' => FALSE, ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Generate'), ); @@ -320,7 +323,8 @@ function devel_generate_vocab_form() { '#title' => t('Delete existing vocabularies before generating new ones.'), '#default_value' => FALSE, ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Generate'), ); @@ -435,7 +439,7 @@ function devel_generate_menu_form() { '#size' => 10, '#states' => array( 'visible' => array( - ':input[name=existing_menus[__new-menu__]]' => array('checked' => TRUE), + ':input[name="existing_menus[__new-menu__]"]' => array('checked' => TRUE), ), ), ); @@ -487,7 +491,8 @@ function devel_generate_menu_form() { '#title' => t('Delete existing custom generated menus and menu links before generating new ones.'), '#default_value' => FALSE, ); - $form['submit'] = array( + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Generate'), ); diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate_batch.inc b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate_batch.inc index 2e903570b..61ccc4d7c 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate_batch.inc +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/devel_generate_batch.inc @@ -1,30 +1,29 @@ <?php /** - * Devel Generate batch handling functions using the BatchAPI + * Devel Generate batch handling functions using the BatchAPI. */ /** - * Functions called from FAPI: + * Form constructor generating in batches. */ - function devel_generate_batch_content($form_state) { $operations = array(); // Setup the batch operations and save the variables. $operations[] = array('devel_generate_batch_content_pre_node', array($form_state['values'])); - // add the kill operation + // Add the kill operation. if ($form_state['values']['kill_content']) { $operations[] = array('devel_generate_batch_content_kill', array()); } - // add the operations to create the nodes + // Add the operations to create the nodes. for ($num = 0; $num < $form_state['values']['num_nodes']; $num ++) { $operations[] = array('devel_generate_batch_content_add_node', array()); } - // start the batch + // Start the batch. $batch = array( 'title' => t('Generating Content'), 'operations' => $operations, @@ -34,10 +33,6 @@ function devel_generate_batch_content($form_state) { batch_set($batch); } -/** - * Create Content Batch Functions: - */ - function devel_generate_batch_content_kill(&$context) { module_load_include('inc', 'devel_generate', 'devel_generate'); devel_generate_content_kill($context['results']); @@ -50,12 +45,18 @@ function devel_generate_batch_content_pre_node($vars, &$context) { devel_generate_content_pre_node($context['results']); } +/** + * Batch API callback: Generate nodes. + */ function devel_generate_batch_content_add_node(&$context) { module_load_include('inc', 'devel_generate', 'devel_generate'); devel_generate_content_add_node($context['results']); $context['results']['num_nids'] ++; } +/** + * Display a message when a batch is complete. + */ function devel_generate_batch_finished($success, $results, $operations) { if ($success) { $message = t('Finished @num_nids nodes created successfully.', array('@num_nids' => $results['num_nids'])); @@ -65,4 +66,3 @@ function devel_generate_batch_finished($success, $results, $operations) { } drupal_set_message($message); } - diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/file.devel_generate.inc b/docroot/sites/all/modules/contrib/devel/devel_generate/file.devel_generate.inc index c4e76eac3..1e786982b 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/file.devel_generate.inc +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/file.devel_generate.inc @@ -14,15 +14,22 @@ function _file_devel_generate($object, $field, $instance, $bundle) { if (empty($file)) { if ($path = devel_generate_textfile()) { - $source = new stdClass(); - $source->uri = $path; - $source->uid = 1; // TODO: randomize? use case specific. - $source->filemime = 'text/plain'; - $source->filename = basename($path); $destination_dir = $field['settings']['uri_scheme'] . '://' . $instance['settings']['file_directory']; file_prepare_directory($destination_dir, FILE_CREATE_DIRECTORY); - $destination = $destination_dir . '/' . basename($path); - $file = file_move($source, $destination, FILE_CREATE_DIRECTORY); + if ($uri = file_unmanaged_move($path, $destination_dir)) { + $file = new stdClass(); + $file->fid = NULL; + $file->uri = $uri; + $file->filename = drupal_basename($uri); + $file->filemime = file_get_mimetype($file->uri); + // @todo Randomize file owner. + $file->uid = 1; + $file->devel_generate = TRUE; + $file = file_save($file); + } + else { + return FALSE; + } } else { return FALSE; diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/image.devel_generate.inc b/docroot/sites/all/modules/contrib/devel/devel_generate/image.devel_generate.inc index df4ff5888..faa9a1d7e 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/image.devel_generate.inc +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/image.devel_generate.inc @@ -29,16 +29,22 @@ function _image_devel_generate($object, $field, $instance, $bundle) { // Generate a max of 5 different images. if (!isset($images[$extension][$min_resolution][$max_resolution]) || count($images[$extension][$min_resolution][$max_resolution]) <= DEVEL_GENERATE_IMAGE_MAX) { if ($path = devel_generate_image($extension, $min_resolution, $max_resolution)) { - $source = new stdClass(); - $source->uri = $path; - $source->uid = 1; // TODO: randomize? Use case specific. - $source->filemime = 'image/' . pathinfo($path, PATHINFO_EXTENSION); - $source->filename = basename($path); $destination_dir = $field['settings']['uri_scheme'] . '://' . $instance['settings']['file_directory']; file_prepare_directory($destination_dir, FILE_CREATE_DIRECTORY); - $destination = $destination_dir . '/' . basename($path); - $file = file_move($source, $destination, FILE_CREATE_DIRECTORY); - $images[$extension][$min_resolution][$max_resolution][$file->fid] = $file; + if ($uri = file_unmanaged_move($path, $destination_dir)) { + $file = new stdClass(); + $file->fid = NULL; + $file->uri = $uri; + $file->filename = drupal_basename($uri); + $file->filemime = file_get_mimetype($file->uri); + // @todo Randomize file owner. + $file->uid = 1; + $file = file_save($file); + $images[$extension][$min_resolution][$max_resolution][$file->fid] = $file; + } + else { + return FALSE; + } } else { return FALSE; diff --git a/docroot/sites/all/modules/contrib/devel/devel_generate/text.devel_generate.inc b/docroot/sites/all/modules/contrib/devel/devel_generate/text.devel_generate.inc index c63a92edc..dedbcd5f7 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_generate/text.devel_generate.inc +++ b/docroot/sites/all/modules/contrib/devel/devel_generate/text.devel_generate.inc @@ -21,14 +21,15 @@ function _text_devel_generate($object, $field, $instance, $bundle) { if (empty($field['settings']['max_length'])) { // Textarea handling - $object_field['value'] = devel_create_content($format); + $object_field['value'] = devel_create_content(); if ($instance['widget']['type'] == 'text_textarea_with_summary' && !empty($instance['display_summary'])) { - $object_field['summary'] = devel_create_content($format); + $object_field['summary'] = devel_create_content(); } } else { // Textfield handling. - $object_field['value'] = substr(devel_create_greeking(mt_rand(1, $field['settings']['max_length'] / 6), FALSE), 0, $field['settings']['max_length']); + $max = ceil($field['settings']['max_length'] / 6); + $object_field['value'] = substr(devel_create_greeking(mt_rand(1, $max), FALSE), 0, $field['settings']['max_length']); } $object_field['format'] = $format; return $object_field; diff --git a/docroot/sites/all/modules/contrib/devel/devel_krumo.css b/docroot/sites/all/modules/contrib/devel/devel_krumo.css new file mode 100644 index 000000000..97018fdbd --- /dev/null +++ b/docroot/sites/all/modules/contrib/devel/devel_krumo.css @@ -0,0 +1,11 @@ +/** + * Krumo + */ +.krumo-version, +.krumo-call { + white-space: nowrap; +} + +.krumo-nest { + display: none; +} diff --git a/docroot/sites/all/modules/contrib/devel/devel_krumo_path.js b/docroot/sites/all/modules/contrib/devel/devel_krumo.js similarity index 70% rename from docroot/sites/all/modules/contrib/devel/devel_krumo_path.js rename to docroot/sites/all/modules/contrib/devel/devel_krumo.js index d4a578dd2..28f01cea8 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_krumo_path.js +++ b/docroot/sites/all/modules/contrib/devel/devel_krumo.js @@ -1,13 +1,21 @@ +/** + * @file + * Behaviors for Devel. + */ + (function ($) { /** * Attaches double-click behavior to toggle full path of Krumo elements. + * + * @type {Drupal~behavior} */ Drupal.behaviors.devel = { attach: function (context, settings) { + // Path // Add hint to footnote - $('.krumo-footnote .krumo-call').once().before('<img style="vertical-align: middle;" title="Click to expand. Double-click to show path." src="' + settings.basePath + 'misc/help.png"/>'); + $('.krumo-footnote .krumo-call', context).once().before('<img style="vertical-align: middle;" title="Click to expand. Double-click to show path." src="' + settings.basePath + 'misc/help.png"/>'); var krumo_name = []; var krumo_type = []; @@ -21,7 +29,9 @@ Drupal.behaviors.devel = { } } - $('.krumo-child > div:first-child', context).dblclick( + $('.krumo-child > div:first-child', context).once('krumo_path', + function() { + $('.krumo-child > div:first-child', context).dblclick( function(e) { if ($(this).find('> .krumo-php-path').length > 0) { // Remove path if shown. @@ -58,9 +68,20 @@ Drupal.behaviors.devel = { krumo_name = []; krumo_type = []; } - } - ); - } -}; + }); + }); + + // Events + $('.krumo-element').once('krumo-events', function() { + $(this).click(function() { + krumo.toggle(this); + }).mouseover(function() { + krumo.over(this); + }).mouseout(function() { + krumo.out(this); + }); + });// End krumo-events .once + }// End attach. +};// End behaviors.devel. -})(jQuery); +})(jQuery);// end outer function diff --git a/docroot/sites/all/modules/contrib/devel/devel_node_access.api.php b/docroot/sites/all/modules/contrib/devel/devel_node_access.api.php index aacf9a639..79265ff92 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_node_access.api.php +++ b/docroot/sites/all/modules/contrib/devel/devel_node_access.api.php @@ -13,19 +13,19 @@ /** * Explain your records in the {node_access} table. * - * In order to help developers and administrators understand the forces - * that control access to any given node, the DNA module provides the + * In order to help developers and administrators understand the forces that + * control access to any given node, the DNA module provides the * Devel Node Access block, which lists all the grant records in the * {node_access} table for that node. * * However, every Node Access module is free in how it defines and uses the - * 'realm' and 'gid' fields in its records in the {node_access} table, and - * it's often difficult to interpret them. This hook passes each record - * that DNA wants to display, and the owning module is expected to return - * an explanation of that record. + * 'realm' and 'gid' fields in its records in the {node_access} table, and it's + * often difficult to interpret them. This hook passes each record that DNA + * wants to display, and the owning module is expected to return an explanation + * of that record. * - * The explanation should not be localized (not be passed through t()), so - * that administrators seeking help can present English explanations. + * The explanation should not be localized (not be passed through t()), so that + * administrators seeking help can present English explanations. * * @param $row * The record from the {node_access} table, as object. The member fields are: diff --git a/docroot/sites/all/modules/contrib/devel/devel_node_access.info b/docroot/sites/all/modules/contrib/devel/devel_node_access.info index 22b82bcf7..134932c2b 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_node_access.info +++ b/docroot/sites/all/modules/contrib/devel/devel_node_access.info @@ -6,9 +6,8 @@ core = 7.x configure = admin/config/development/devel tags[] = developer -; Information added by Drupal.org packaging script on 2014-05-01 -version = "7.x-1.5" +; Information added by Drupal.org packaging script on 2018-04-18 +version = "7.x-1.6" core = "7.x" project = "devel" -datestamp = "1398963366" - +datestamp = "1524009787" diff --git a/docroot/sites/all/modules/contrib/devel/devel_node_access.install b/docroot/sites/all/modules/contrib/devel/devel_node_access.install index 0088d78c7..541204526 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_node_access.install +++ b/docroot/sites/all/modules/contrib/devel/devel_node_access.install @@ -1,5 +1,10 @@ <?php +/** + * @file + * Uninstall function for Devel node access. + */ + /** * Implements hook_uninstall(). */ diff --git a/docroot/sites/all/modules/contrib/devel/devel_node_access.js b/docroot/sites/all/modules/contrib/devel/devel_node_access.js index b79094291..048fefefc 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_node_access.js +++ b/docroot/sites/all/modules/contrib/devel/devel_node_access.js @@ -1,11 +1,12 @@ /** - * @file devel_node_access.js. + * @file + * Behavior for Devel node access. */ (function ($) { /** - * Perform the access by user ajax request. + * Performs the access by user ajax request. */ function devel_node_access_user_ajax(context, settings) { // Get the cell ID for the first .dna-permission that isn't processed. @@ -53,6 +54,8 @@ /** * Attach the access by user behavior which initiates ajax. + * + * @type {Drupal~behavior} */ Drupal.behaviors.develNodeAccessUserAjax = { attach: function(context, settings) { diff --git a/docroot/sites/all/modules/contrib/devel/devel_node_access.module b/docroot/sites/all/modules/contrib/devel/devel_node_access.module index 74e927e9b..ad574c4d5 100644 --- a/docroot/sites/all/modules/contrib/devel/devel_node_access.module +++ b/docroot/sites/all/modules/contrib/devel/devel_node_access.module @@ -1,15 +1,18 @@ <?php /** * @file + * Functions for debugging node access permissions. * - * This module gives developers feedback as to what their - * node_access table contains, and which nodes are protected or - * visible to the public. + * This module gives developers feedback as to what their node_access table + * contains, and which nodes are protected or visible to the public. * */ define('DNA_ACCESS_VIEW', 'view devel_node_access information'); +/** + * Implements hook_permission(). + */ function devel_node_access_permission() { return array( 'view devel_node_access information' => array( @@ -51,7 +54,7 @@ function devel_node_access_menu() { if (!module_exists('devel')) { if (!menu_load('devel')) { - // we have to create the 'devel' menu ourselves + // We have to create the 'devel' menu ourselves. $menu = array( 'menu_name' => 'devel', 'title' => 'Development', @@ -60,10 +63,10 @@ function devel_node_access_menu() { menu_save($menu); } - // we have to create the 'Devel settings' menu item ourselves + // We have to create the 'Devel settings' menu item ourselves. $items['admin/config/development/devel'] = array( 'title' => 'Devel settings', - 'description' => 'Helper pages and blocks to assist Drupal developers and admins with node_access. The devel blocks can be managed via the <a href="' . url('admin/structure/block') . '">block administration</a> page.', + 'description' => 'Helper pages and blocks to assist Drupal developers and admins with node_access. The devel blocks can be managed via the <a href="/admin/structure/block">block administration</a> page.', 'page callback' => 'drupal_get_form', 'page arguments' => array('devel_node_access_admin_settings'), 'access arguments' => array('administer site configuration'), @@ -73,7 +76,7 @@ function devel_node_access_menu() { ); } - // create a callback for use by devel_node_access_user_ajax(). + // Create a callback for use by devel_node_access_user_ajax(). $items['devel/node_access/by_user/%/%'] = array( 'page callback' => 'devel_node_access_user_ajax', 'page arguments' => array(3, 4), @@ -81,7 +84,7 @@ function devel_node_access_menu() { 'type' => MENU_CALLBACK, ); - // add this to the custom menu 'devel' created by the devel module. + // Add this to the custom menu 'devel' created by the devel module. $items['devel/node_access/summary'] = array( 'title' => 'Node_access summary', 'page callback' => 'dna_summary', @@ -92,11 +95,24 @@ function devel_node_access_menu() { return $items; } +/** + * Form constructor for Devel node access settings. + * + * @see devel_node_access_form_alter() + * + * @ingroup forms + */ function devel_node_access_admin_settings() { $form = array(); return system_settings_form($form); } +/** + * Implements hook_form_alter(). + * + * Adds form elements to devel_admin_settings() and + * devel_node_access_admin_settings(). + */ function devel_node_access_form_alter(&$form, $form_state, $form_id) { $tr = 't'; if ($form_id == 'devel_admin_settings' || $form_id == 'devel_node_access_admin_settings') { @@ -126,6 +142,9 @@ function devel_node_access_form_alter(&$form, $form_state, $form_id) { } } +/** + * Page callback for the Devel node access summary. + */ function dna_summary() { // warn user if they have any entries that could grant access to all nodes $output = ''; @@ -221,6 +240,16 @@ function dna_summary() { return $output; } +/** + * Retreives the nodes visible in the current menu entry. + * + * @param integer $nid + * (optional) A node ID to add to the list. + * + * @return array + * An associative array of Node ID's that this function has been called with + * keyed by Node ID. + */ function dna_visible_nodes($nid = NULL) { static $nids = array(); if ($nid) { @@ -237,11 +266,21 @@ function dna_visible_nodes($nid = NULL) { return $nids; } +/** + * Implements hook_node_view(). + */ function devel_node_access_node_view($node, $build_mode) { // remember this node, for display in our block dna_visible_nodes($node->nid); } +/** + * Invokes a hook. + * + * @return + * The results of the hook invocation keyed by the machine name of the + * implementing module. + */ function _devel_node_access_module_invoke_all() { // array and scalar returns $args = func_get_args(); $hook = $args[0]; @@ -254,12 +293,12 @@ function _devel_node_access_module_invoke_all() { // array and scalar returns if (isset($result)) { if (is_array($result)) { foreach ($result as $key => $value) { - // add name of module that returned the value: + // Add name of module that returned the value. $result[$key]['#module'] = $module; } } else { - // build array with result keyed by $module: + // Build array with result keyed by $module. $result = array($module => $result); } $return = array_merge_recursive($return, $result); @@ -270,12 +309,13 @@ function _devel_node_access_module_invoke_all() { // array and scalar returns } /** - * Helper function to build an associative array of grant records and their - * history. If there are duplicate records, display an error message. + * Builds an associative array of grant records and their history. + * + * If there are duplicate records, display an error message. * * @param $grants - * An indexed array of grant records, augmented by the '#module' key, - * as created by _devel_node_access_module_invoke_all('node_access_records'). + * An indexed array of grant records, augmented by the '#module' key, as + * created by _devel_node_access_module_invoke_all('node_access_records'). * * @param $node * The node that the grant records belong to. @@ -321,8 +361,7 @@ function _devel_node_access_build_nar_data($grants, $node, $function) { } /** - * Helper function to mimic hook_node_access_records_alter() and trace what - * each module does with it. + * Mimics hook_node_access_records_alter() and traces what each module does with it. * * @param object $grants * An indexed array of grant records, augmented by the '#module' key, @@ -350,18 +389,19 @@ function _devel_node_access_nar_alter(&$grants, $node) { isset($drupal_static['drupal_alter']) || ($drupal_static['drupal_alter'] = &drupal_static('drupal_alter')); $functions = $drupal_static['drupal_alter']; - // build the initial tree (and check for duplicates) + // Build the initial tree (and check for duplicates). $data = _devel_node_access_build_nar_data($grants, $node, 'hook_node_access_records()'); - // simulate drupal_alter('node_access_records', $grants, $node); + // Simulate drupal_alter('node_access_records', $grants, $node); foreach ($functions['node_access_records'] as $function) { - // call hook_node_access_records_alter() for one module at a time and analyze + // Call hook_node_access_records_alter() for one module at a time and + // analyze. $function($grants, $node); // <== $module = substr($function, 0, strlen($function) - 26); foreach ($grants as $i => $grant) { if (empty($data[$grant['realm']][$grant['gid']]['current'])) { - // it's an added grant + // It's an added grant. $data[$grant['realm']][$grant['gid']]['current'] = $grant; $data[$grant['realm']][$grant['gid']]['current']['#module'] = $module; $data[$grant['realm']][$grant['gid']]['changes'][] = array( @@ -371,14 +411,14 @@ function _devel_node_access_nar_alter(&$grants, $node) { $grants[$i]['#module'] = $module; } else { - // it's an existing grant, check for changes + // It's an existing grant, check for changes. $view = $update = $delete = FALSE; foreach (array('view', 'update', 'delete') as $op) { $$op = $grant["grant_$op"] - $data[$grant['realm']][$grant['gid']]['current']["grant_$op"]; } $priority = $grant['priority'] - $data[$grant['realm']][$grant['gid']]['current']['priority']; if ($view || $update || $delete || $priority) { - // it was changed + // It was changed. $data[$grant['realm']][$grant['gid']]['current'] = $grant; $data[$grant['realm']][$grant['gid']]['current']['#module'] = $module; $data[$grant['realm']][$grant['gid']]['changes'][] = array( @@ -391,10 +431,10 @@ function _devel_node_access_nar_alter(&$grants, $node) { $data[$grant['realm']][$grant['gid']]['found'] = TRUE; } - // check for newly introduced duplicates + // Check for newly introduced duplicates. _devel_node_access_build_nar_data($grants, $node, 'hook_node_access_records_alter()'); - // look for grant records that have disappeared + // Look for grant records that have disappeared. foreach ($data as $realm => $data2) { foreach ($data2 as $gid => $data3) { if (empty($data[$realm][$gid]['found']) && isset($data[$realm][$gid]['current'])) { @@ -413,14 +453,12 @@ function _devel_node_access_nar_alter(&$grants, $node) { } /** - * Helper function to mimic hook_node_grants_alter() and trace what - * each module does with it. + * Mimics hook_node_grants_alter() and traces what each module does with it. * * @param object $grants - * An indexed array of grant records, augmented by the '#module' key, - * as created by _devel_node_access_module_invoke_all('node_grants'). - * This array is updated by the hook_node_grants_alter() - * implementations. + * An indexed array of grant records, augmented by the '#module' key, as + * created by _devel_node_access_module_invoke_all('node_grants'). This array + * is updated by the hook_node_grants_alter() implementations. * * @param $node * The node that the grant records belong to. @@ -429,12 +467,13 @@ function _devel_node_access_nar_alter(&$grants, $node) { * A tree representation of the grant records in $grants including their * history: * $data[$realm][$gid] - * ['cur'] - TRUE or FALSE whether the gid is present or not - * ['ori'][] - array of module names that contributed this grant (if any) - * ['chg'][] - array of changes, such as - * - 'added' if module name is a prefix if the $realm, - * - 'added by module' otherwise, or - * - 'removed by module' + * - ['cur']: TRUE or FALSE whether the gid is present or not + * - ['ori'][]: An array of module names that contributed this grant (if + * any) + * - ['chg'][]: An array of changes, such as + * - 'added' if module name is a prefix if the $realm, + * - 'added by module' otherwise, or + * - 'removed by module' */ function _devel_node_access_ng_alter(&$grants, $account, $op) { //dpm($grants, '_devel_node_access_ng_alter(): grants IN'); @@ -444,7 +483,7 @@ function _devel_node_access_ng_alter(&$grants, $account, $op) { isset($drupal_static['drupal_alter']) || ($drupal_static['drupal_alter'] = &drupal_static('drupal_alter')); $functions = $drupal_static['drupal_alter']; - // build the initial structure + // Build the initial structure. $data = array(); foreach ($grants as $realm => $gids) { foreach ($gids as $i => $gid) { @@ -456,13 +495,13 @@ function _devel_node_access_ng_alter(&$grants, $account, $op) { unset($grants[$realm]['#module']); } - // simulate drupal_alter('node_grants', $grants, $account, $op); + // Simulate drupal_alter('node_grants', $grants, $account, $op); foreach ($functions['node_grants'] as $function) { - // call hook_node_grants_alter() for one module at a time and analyze + // Call hook_node_grants_alter() for one module at a time and analyze. $function($grants, $account, $op); // <== $module = substr($function, 0, strlen($function) - 18); - // check for new gids + // Check for new gids. foreach ($grants as $realm => $gids) { foreach ($gids as $i => $gid) { if (empty($data[$realm][$gid]['cur'])) { @@ -472,7 +511,7 @@ function _devel_node_access_ng_alter(&$grants, $account, $op) { } } - // check for removed gids + // Check for removed gids. foreach ($data as $realm => $gids) { foreach ($gids as $gid => $history) { if ($history['cur'] && array_search($gid, $grants[$realm]) === FALSE) { @@ -598,9 +637,9 @@ function devel_node_access_block_view($delta) { foreach ($nids as $nid) { $acquired_grants_nid = array(); if ($node = node_load($nid)) { - // check node_access_acquire_grants() + // Check node_access_acquire_grants(). $grants = _devel_node_access_module_invoke_all('node_access_records', $node); - // check drupal_alter('node_access_records') + // Check drupal_alter('node_access_records'). $data = _devel_node_access_nar_alter($grants, $node); /* (This was the D6 implementation that didn't analyze the hook_node_access_records_alter() details.) if (!empty($grants)) { @@ -645,19 +684,20 @@ function devel_node_access_block_view($delta) { } /**/ //dpm($acquired_grants_nid, "acquired_grants_nid ="); - // check node_access_grants() + // Check node_access_grants(). $published_nid[$nid] = $node->status; if ($node->nid) { foreach (array('view', 'update', 'delete') as $op) { $grants = _devel_node_access_module_invoke_all('node_grants', $user, $op); - // call all hook_node_grants_alter() implementations + // Call all hook_node_grants_alter() implementations. $ng_alter_datas[$op] = _devel_node_access_ng_alter($grants, $user, $op); $checked_grants[$nid][$op] = array_merge(array('all' => array(0)), $grants); } } } - // check for grants in the node_access table that aren't returned by node_access_acquire_grants() + // Check for grants in the node_access table that aren't returned by + // node_access_acquire_grants(). if (isset($active_grants[$nid])) { foreach ($active_grants[$nid] as $realm => $active_grants_realm) { @@ -686,14 +726,15 @@ function devel_node_access_block_view($delta) { elseif (!$found) { $acknowledged = _devel_node_access_module_invoke_all('node_access_acknowledge', $fixed_grant); if (empty($acknowledged)) { - // no module acknowledged this record, mark it as alien + // No module acknowledged this record, mark it as alien. $fixed_grant += array( 'priority' => '?', 'state' => 'alien', ); } else { - // at least one module acknowledged the record, attribute it to the first one + // At least one module acknowledged the record. Attribute it + // to the first one. $acknowledged_keys = array_keys($acknowledged); $fixed_grant += array( 'priority' => '–', @@ -714,7 +755,7 @@ function devel_node_access_block_view($delta) { } } - // order grants and evaluate their status + // Order grants and evaluate their status. foreach ($acquired_grants_nid as $priority => $acquired_grants_priority) { ksort($acquired_grants_priority); foreach ($acquired_grants_priority as $realm => $acquired_grants_realm) { @@ -750,7 +791,7 @@ function devel_node_access_block_view($delta) { } } - // fill in the table rows + // Fill in the table rows. $rows = array(); $error_count = 0; foreach ($all_grants as $grant) { @@ -804,7 +845,7 @@ function devel_node_access_block_view($delta) { ); } - // prepend information from the D7 hook_node_access_records_alter() + // Prepend information from the D7 hook_node_access_records_alter(). $next_style = array(); if (isset($grant['history'])) { $history = $grant['history']; @@ -845,14 +886,15 @@ function devel_node_access_block_view($delta) { } } - // fix up the main row cells with the proper class (needed for Bartik) + // Fix up the main row cells with the proper class (needed for + // Bartik). foreach ($row as $key => $value) { if (!is_array($value)) { $row[$key] = array('data' => $value); } $row[$key]['class'] = array($class); } - // add the main row + // Add the main row. $will_append = empty($history['current']) && !empty($history['changes']); $rows[] = array( 'data' => array_values($row), @@ -860,7 +902,7 @@ function devel_node_access_block_view($delta) { 'style' => array_merge($next_style, ($will_append ? array('border-bottom-style: none;') : array())), ); - // append information from the D7 hook_node_access_records_alter() + // Append information from the D7 hook_node_access_records_alter(). if ($will_append) { $last_change = end($history['changes']); $rows[] = array( @@ -903,7 +945,8 @@ function devel_node_access_block_view($delta) { ); } - // Explain whether access is granted or denied, and why (using code from node_access()). + // Explain whether access is granted or denied, and why (using code from + // node_access()). $tr = 't'; array_shift($nids); // remove the 0 $accounts = array(); @@ -932,7 +975,7 @@ function devel_node_access_block_view($delta) { $menu_item = menu_get_item(); $map = $menu_item['original_map']; if ($map[0] == 'node' && isset($map[1]) && is_numeric($map[1]) && !isset($map[2]) && !$block1_visible) { - // only for single nodes + // Only for single nodes. if (user_is_logged_in()) { $accounts[] = user_load(0); // Anonymous, too } @@ -988,7 +1031,7 @@ function devel_node_access_block_view($delta) { return array('subject' => $subject, 'content' => $output); case 'dna_user': - // show which users can access this node + // Show which users can access this node. $menu_item = menu_get_item(); $map = $menu_item['original_map']; if ($map[0] != 'node' || !isset($map[1]) || !is_numeric($map[1]) || isset($map[2])) { @@ -1079,7 +1122,7 @@ function devel_node_access_block_view($delta) { } /** - * Callback function for node access by user block ajax. + * Page callback for node access by user block ajax. */ function devel_node_access_user_ajax($data_type, $cell) { list($op, $nid, $uid) = explode('-', $cell); @@ -1117,7 +1160,8 @@ function devel_node_access_user_ajax($data_type, $cell) { /** * Helper function that mimicks node.module's node_access() function. * - * Unfortunately, this needs to be updated manually whenever node.module changes! + * Unfortunately, this needs to be updated manually whenever node.module + * changes! * * @return * An array suitable for theming with theme_dna_permission(). @@ -1257,7 +1301,13 @@ function _devel_node_access_explain_access($op, $node, $account = NULL) { } /** - * Helper function to create a list of the grants returned by hook_node_grants(). + * Creates a list of the grants returned by hook_node_grants(). + * + * @param integer $nid + * @param array $ng_alter_data + * + * @return + * A themed item list of grants. */ function _devel_node_access_get_grant_list($nid, $ng_alter_data) { //dpm($ng_alter_data, "_devel_node_access_get_grant_list($nid,"); @@ -1323,7 +1373,16 @@ function devel_node_access_node_access_explain($row) { } /** - * Helper function to return a sanitized node title. + * Return a sanitized node title. + * + * @param $node + * The node from which to get the title. + * @param boolean $clip_and_decorate + * (optional) Set to TRUE to limit the length of the returned title and to add + * markup to make it easier to style. + * + * @return string + * The sanitized node title. */ function _devel_node_access_get_node_title($node, $clip_and_decorate = FALSE) { if (isset($node)) { @@ -1345,7 +1404,13 @@ function _devel_node_access_get_node_title($node, $clip_and_decorate = FALSE) { } /** - * Helper function to apply common formatting to a debug-mode table row. + * Applies common formatting to a debug-mode table row. + * + * @param array $row + * The row to format. + * @param boolean $may_unpack + * (optional) Indicates if $row['data'] needs be formatted rather than $row + * itself. Default is TRUE. */ function _devel_node_access_format_row($row, $may_unpack = TRUE) { if ($may_unpack && isset($row['data'])) { @@ -1385,7 +1450,14 @@ function devel_node_access_theme() { } /** - * Indicate whether user has a permission or not. + * Returns HTML to indicate if a user has a permission. + * + * @param array $variables + * An associative array containing: + * - permission: An indexed array containing: + * - 0: A value indicating if the user has permission. + * - 1: The text of the message to display. + * - 2: The title to display containing additional information. */ function theme_dna_permission($variables) { $permission = &$variables['permission']; diff --git a/docroot/sites/all/modules/contrib/devel/krumo/INSTALL b/docroot/sites/all/modules/contrib/devel/krumo/INSTALL new file mode 100644 index 000000000..9283bc522 --- /dev/null +++ b/docroot/sites/all/modules/contrib/devel/krumo/INSTALL @@ -0,0 +1,32 @@ +------------------------------------------------------------------------------ + + SETUP: How to install Krumo ? + +------------------------------------------------------------------------------ + +In order to use Krumo you have to put it on your (development) server, and +include it in your script. You can put it somewhere in the INCLUDE_PATH, or +specify the full path to the "class.krumo.php" file. + +You have to modify the "krumo.ini" file too. It is the configuration file for +Krumo. The first option is choosing a skin: + + [skin] + selected = "orange" + +The value for this setting has to be the name of one of the sub-folders from the +"Krumo/skins/" folder. If the value provided for the skin results in not finding +the skin, the `default` skin will be used instead. + +The second option is used to set the correct web path to the folder where Krumo +is installed. This is used in order to make the images from Krumo's CSS skins +web-accessible. + + [css] + url = "http://www.example.com/Krumo/" + +So far those two are the only configuration options. + +All the CSS files ("skin.css") from the "Krumo/skins/" sub-folders must have the +proper permissions in order to be readable from Krumo. Same applies for +"krumo.ini" and "krumo.js" files. diff --git a/docroot/sites/all/modules/contrib/devel/krumo/LICENSE b/docroot/sites/all/modules/contrib/devel/krumo/LICENSE old mode 100755 new mode 100644 index 03851a338..678c6921d --- a/docroot/sites/all/modules/contrib/devel/krumo/LICENSE +++ b/docroot/sites/all/modules/contrib/devel/krumo/LICENSE @@ -1,504 +1,504 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/README b/docroot/sites/all/modules/contrib/devel/krumo/README new file mode 100644 index 000000000..99513ea35 --- /dev/null +++ b/docroot/sites/all/modules/contrib/devel/krumo/README @@ -0,0 +1,103 @@ +============================================================================= + + Krumo + version 0.2.1a + +============================================================================= + +You probably got this package from... +http://www.sourceforge.net/projects/krumo/ + +If there is no licence agreement with this package please download +a version from the location above. You must read and accept that +licence to use this software. The file is titled simply LICENSE. + +OVERVIEW +------------------------------------------------------------------------------ +To put it simply, Krumo is a replacement for print_r() and var_dump(). By +definition Krumo is a debugging tool (for PHP5), which displays structured +information about any PHP variable. + +A lot of developers use print_r() and var_dump() in the means of debugging +tools. Although they were intended to present human readble information about a +variable, we can all agree that in general they are not. Krumo is an +alternative: it does the same job, but it presents the information beautified +using CSS and DHTML. + +EXAMPLES +------------------------------------------------------------------------------ +Here's a basic example, which will return a report on the array variable passed +as argument to it: + + krumo(array('a1'=> 'A1', 3, 'red')); + +You can dump simultaneously more then one variable - here's another example: + + krumo($_SERVER, $_REQUEST); + +You probably saw from the examples above that some of the nodes are expandable, +so if you want to inspect the nested information, click on them and they will +expand; if you do not need that information shown simply click again on it to +collapse it. Here's an example to test this: + + $x1->x2->x3->x4->x5->x6->x7->x8->x9 = 'X10'; + krumo($x1); + +The krumo() is the only standalone function from the package, and this is +because basic dumps about variables (like print_r() or var_dump()) are the most +common tasks such functionality is used for. The rest of the functionality can +be called using static calls to the Krumo class. Here are several more examples: + + // print a debug backgrace + krumo::backtrace(); + + // print all the included(or required) files + krumo::includes(); + + // print all the included functions + krumo::functions(); + + // print all the declared classes + krumo::classes(); + + // print all the defined constants + krumo::defines(); + + ... and so on, etc. + +A full PHPDocumenter API documentation exists both in this package and at the +project's website. + +INSTALL +------------------------------------------------------------------------------ +Read the INSTALL file. + +DOCUMENTATION +------------------------------------------------------------------------------ +As I said, a full PHPDocumenter API documentation can be found both in this +package and at the project's website. + +SKINS +------------------------------------------------------------------------------ +There are several skins pre-installed with this package, but if you wish you can +create skins of your own. The skins are simply CSS files that are prepended to +the result that Krumo prints. If you want to use images in your CSS (for +background, list-style, etc), you have to put "%URL%" in front of the image URL +in order hook it up to the skin folder and make the image web-accessible. + +Here's an example: + + ul.krumo-first {background: url(%url%bg.gif);} + +TODO +------------------------------------------------------------------------------ +You can find the list of stuff that is going to be added to this project in the +TODO file from this very package. + +CONTRIBUTION +----------------------------------------------------------------------------- +If you download and use and possibly even extend this tool, please let us know. +Any feedback, even bad, is always welcome and your suggestions are going to be +considered for our next release. Please use our SourceForge page for that: + + http://www.sourceforge.net/projects/krumo/ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/TODO b/docroot/sites/all/modules/contrib/devel/krumo/TODO old mode 100755 new mode 100644 index d1de49fab..8989f9af6 --- a/docroot/sites/all/modules/contrib/devel/krumo/TODO +++ b/docroot/sites/all/modules/contrib/devel/krumo/TODO @@ -1,24 +1,24 @@ -****************************************************************************** - - Krumo: TODO - -****************************************************************************** - -BUGS ----------------- - - watch the SourceForge.net Bug Tracker - -Features: PHP ----------------- - - Try to detect anonymous (lambda) functions - - Try to detect whether an array is indexed or associated - - Add var_export support for arrays and objects - - Add JSON support for arrays and objects - -Features: GUI ----------------- - - Nicer and friendlier skin(s) - - Add top-level links for collapsing and expanding the whole tree - - Add object & array -level links for collapsing and expanding all the - nested nodes - - Print all parent classes for the rendered objects \ No newline at end of file +****************************************************************************** + + Krumo: TODO + +****************************************************************************** + +BUGS +---------------- + - watch the SourceForge.net Bug Tracker + +Features: PHP +---------------- + - Try to detect anonymous (lambda) functions + - Try to detect whether an array is indexed or associated + - Add var_export support for arrays and objects + - Add JSON support for arrays and objects + +Features: GUI +---------------- + - Nicer and friendlier skin(s) + - Add top-level links for collapsing and expanding the whole tree + - Add object & array -level links for collapsing and expanding all the + nested nodes + - Print all parent classes for the rendered objects diff --git a/docroot/sites/all/modules/contrib/devel/krumo/VERSION b/docroot/sites/all/modules/contrib/devel/krumo/VERSION old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/class.krumo.php b/docroot/sites/all/modules/contrib/devel/krumo/class.krumo.php old mode 100755 new mode 100644 index 25dd1e536..ec31a0aaf --- a/docroot/sites/all/modules/contrib/devel/krumo/class.krumo.php +++ b/docroot/sites/all/modules/contrib/devel/krumo/class.krumo.php @@ -655,6 +655,15 @@ // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + /** + * Allows CSS and Javascript to be included without performing a krumo::dump(). + */ + Public Static Function addCssJs() { + return krumo::_css(); + } + + // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + /** * Print the skin (CSS) * @@ -674,7 +683,7 @@ $css = ''; // DEVEL: changed for Drupal variables system - $skin = variable_get('devel_krumo_skin', 'orange'); + $skin = variable_get('devel_krumo_skin', 'default'); // custom selected skin ? // @@ -705,25 +714,8 @@ // the CSS // - ?> -<!-- Using Krumo Skin: <?php echo preg_replace('~^' . preg_quote(realpath(KRUMO_DIR) . DIRECTORY_SEPARATOR) . '~Uis', '', realpath($_));?> --> -<style type="text/css"> -<!--/**/ -<?php echo $css?> - -/**/--> -</style> -<?php - // the JS - // - ?> -<script type="text/javascript"> -<!--// -<?php echo join(file(KRUMO_DIR . "krumo.js"));?> - -//--> -</script> -<?php + drupal_add_css($css, 'inline'); + drupal_add_js(join(file(KRUMO_DIR . "krumo.js")), 'inline'); } return $_css; @@ -924,7 +916,7 @@ // $_recursion_marker = krumo::_marker(); (is_object($bee)) - ? @($bee->$_recursion_marker++) + ? (empty($bee->$_recursion_marker) ? ($bee->$_recursion_marker = 1) : $bee->$_recursion_marker++) : @($bee[$_recursion_marker]++); $_[0][] =& $bee; @@ -974,6 +966,29 @@ <ul class="krumo-node"> <?php + if ($_is_object && get_class($data) != 'stdClass') { + // this part for protected/private properties only + $refl = new ReflectionClass($data); + foreach ($refl->getProperties() as $property) { + $k = $property->getName(); + if ($k === $_recursion_marker || $property->isPublic()) { + continue; + } + + // add key indicators + if ($property->isProtected()) { + $k .= ':protected'; + } + elseif ($property->isPrivate()) { + $k .= ':private'; + } + + $property->setAccessible(TRUE); + $v = $property->getValue($data); + krumo::_dump($v, $k); + } + } + // keys ? // $keys = ($_is_object) @@ -1045,10 +1060,7 @@ ?> <li class="krumo-child"> - <div class="krumo-element<?php echo count($data) > 0 ? ' krumo-expand' : '';?>" - <?php if (count($data) > 0) {?> onClick="krumo.toggle(this);"<?php } ?> - onMouseOver="krumo.over(this);" - onMouseOut="krumo.out(this);"> + <div class="krumo-element<?php echo !empty($data) ? ' krumo-expand' : '';?>"> <?php /* DEVEL: added htmlSpecialChars */ ?> <a class="krumo-name"><?php echo htmlSpecialChars($name);?></a> @@ -1097,10 +1109,7 @@ ?> <li class="krumo-child"> - <div class="krumo-element<?php echo count($data) > 0 ? ' krumo-expand' : '';?>" - <?php if (count($data) > 0) {?> onClick="krumo.toggle(this);"<?php } ?> - onMouseOver="krumo.over(this);" - onMouseOut="krumo.out(this);"> + <div class="krumo-element<?php echo ' krumo-expand';?>"> <?php /* DEVEL: added htmlSpecialChars */ ?> <a class="krumo-name"><?php echo htmlSpecialChars($name);?></a> @@ -1108,7 +1117,7 @@ <strong class="krumo-class"><?php echo get_class($data);?></strong> </div> - <?php if (count($data)) { + <?php { krumo::_vars($data); } ?> </li> @@ -1244,16 +1253,13 @@ $_extra = false; $_ = $data; if (strLen($data) > KRUMO_TRUNCATE_LENGTH) { - $_ = substr($data, 0, KRUMO_TRUNCATE_LENGTH - 3) . '...'; + $_ = drupal_substr($data, 0, KRUMO_TRUNCATE_LENGTH - 3) . '...'; $_extra = true; } ?> <li class="krumo-child"> - <div class="krumo-element<?php echo $_extra ? ' krumo-expand' : '';?>" - <?php if ($_extra) {?> onClick="krumo.toggle(this);"<?php } ?> - onMouseOver="krumo.over(this);" - onMouseOut="krumo.out(this);"> + <div class="krumo-element<?php echo $_extra ? ' krumo-expand' : '';?>"> <?php /* DEVEL: added htmlSpecialChars */ ?> <a class="krumo-name"><?php echo htmlSpecialChars($name);?></a> diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/_class.krumo.php.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/_class.krumo.php.html index 6b3fcf400..cf495695b 100644 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/_class.krumo.php.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/_class.krumo.php.html @@ -1,267 +1,268 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - <html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <!-- template designed by Marco Von Ballmoos --> - <title>Docs for page class.krumo.php - - - - - -
-

File/class.krumo.php

- - -
-
Description
- -
- -

Krumo: Structured information display solution

-

Krumo is a debugging tool (PHP5 only), which displays structured information about any PHP variable. It is a nice replacement for print_r() or var_dump() which are used by a lot of PHP developers.

- - -
-
- - -
-
Classes
- -
- - - - - - - - - -
ClassDescription
-  class - krumo - - Krumo API -
-
-
- - - -
-
Constants
- -
- -
- -
- - - DIR_SEP = DIRECTORY_SEPARATOR - (line 22) - -
- - -

backward compatibility: the DIR_SEP constant isn't used anymore

- - -
- -
- -
- - - KRUMO_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR - (line 39) - -
- - -

Set the KRUMO_DIR constant up with the absolute path to Krumo files. If it is not defined, include_path will be used. Set KRUMO_DIR only if any other module or application has not already set it up.

- - -
- -
- -
- - - KRUMO_TRUNCATE_LENGTH = 50 - (line 48) - -
- - -

This constant sets the maximum strings of strings that will be shown as they are. Longer strings will be truncated with this length, and their `full form` will be shown in a child node.

- - -
- -
- -
- - - PATH_SEPARATOR = OS_WINDOWS?';':':' - (line 28) - -
- - -

backward compatibility: the PATH_SEPARATOR constant is availble since 4.3.0RC2

- - -
-
-
- - - -
-
Functions
- -
- -
- -
- - krumo (line 1295) -
- - -

Alias of krumo::dump()

- -
- void - - krumo - - ([mixed $data,... = ]) -
- -
    -
  • - mixed - $data,...
  • -
- - -
-
-
- -

- Documentation generated on Sun, 02 Dec 2007 09:43:24 +0200 by phpDocumentor 1.4.0a2 -

-
- \ No newline at end of file + + + + + + Docs for page class.krumo.php + + + + + +
+ +

File/class.krumo.php

+ + +
+
Description
+ +
+ +

Krumo: Structured information display solution

+

Krumo is a debugging tool (PHP5 only), which displays structured information about any PHP variable. It is a nice replacement for print_r() or var_dump() which are used by a lot of PHP developers.

+ + +
+
+ + +
+
Classes
+ +
+ + + + + + + + + +
ClassDescription
+  class + krumo + + Krumo API +
+
+
+ + + +
+
Constants
+ +
+ +
+ +
+ + + DIR_SEP = DIRECTORY_SEPARATOR + (line 22) + +
+ + +

backward compatibility: the DIR_SEP constant isn't used anymore

+ + +
+ +
+ +
+ + + KRUMO_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR + (line 39) + +
+ + +

Set the KRUMO_DIR constant up with the absolute path to Krumo files. If it is not defined, include_path will be used. Set KRUMO_DIR only if any other module or application has not already set it up.

+ + +
+ +
+ +
+ + + KRUMO_TRUNCATE_LENGTH = 50 + (line 48) + +
+ + +

This constant sets the maximum strings of strings that will be shown as they are. Longer strings will be truncated with this length, and their `full form` will be shown in a child node.

+ + +
+ +
+ +
+ + + PATH_SEPARATOR = OS_WINDOWS?';':':' + (line 28) + +
+ + +

backward compatibility: the PATH_SEPARATOR constant is availble since 4.3.0RC2

+ + +
+
+
+ + + +
+
Functions
+ +
+ +
+ +
+ + krumo (line 1295) +
+ + +

Alias of krumo::dump()

+ +
+ void + + krumo + + ([mixed $data,... = ]) +
+ +
    +
  • + mixed + $data,...
  • +
+ + +
+
+
+ +

+ Documentation generated on Sun, 02 Dec 2007 09:43:24 +0200 by phpDocumentor 1.4.0a2 +

+
+ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/krumo.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/krumo.html old mode 100755 new mode 100644 index ce4d33b89..39557ef9a --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/krumo.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/Krumo/krumo.html @@ -1,900 +1,901 @@ - - - - - - Docs For Class krumo - - - - - -
-

 Class krumo

- - -
-
Description
- -
- -

Krumo API

-

This class stores the Krumo API for rendering and displaying the structured information it is reporting

-

- Located in /class.krumo.php (line 61) -

- - -

-	
-			
-
- - - - - -
-
Method Summary
- -
-
- -
-  - static void - backtrace - () -
- -
-  - static void - classes - () -
- -
-  - static void - conf - () -
- -
-  - static void - cookie - () -
- -
-  - static void - defines - () -
- -
-  - static boolean - disable - () -
- -
-  - static void - dump - ( $data, mixed $data,...) -
- -
-  - static boolean - enable - () -
- -
-  - static void - env - () -
- -
-  - static void - extensions - () -
- -
-  - static void - functions - () -
- -
-  - static void - get - () -
- -
-  - static void - headers - () -
- -
-  - static void - includes - () -
- -
-  - static void - ini - (string $ini_file) -
- -
-  - static void - interfaces - () -
- -
-  - static void - path - () -
- -
-  - static void - phpini - () -
- -
-  - static void - post - () -
- -
-  - static void - request - () -
- -
-  - static void - server - () -
- -
-  - static void - session - () -
- -
-  - static string - version - () -
-
-
-
- - - -
-
Methods
- -
- - -
- -
- - static backtrace (line 82) -
- - -

Prints a debug backtrace

-
    -
  • access: public
  • -
- -
- static void - - backtrace - - () -
- - - -
- -
- -
- - static classes (line 101) -
- - -

Prints a list of all currently declared classes.

-
    -
  • access: public
  • -
- -
- static void - - classes - - () -
- - - -
- -
- -
- - static conf (line 297) -
- - -

Prints a list of all your configuration settings.

-
    -
  • access: public
  • -
- -
- static void - - conf - - () -
- - - -
- -
- -
- - static cookie (line 441) -
- - -

Prints a list of all the values from the $_COOKIE array.

-
    -
  • access: public
  • -
- -
- static void - - cookie - - () -
- - - -
- -
- -
- - static defines (line 197) -
- - -

Prints a list of all currently declared constants.

-
    -
  • access: public
  • -
- -
- static void - - defines - - () -
- - - -
- -
- -
- - static disable (line 747) -
- - -

Disable Krumo

-
    -
  • access: public
  • -
- -
- static boolean - - disable - - () -
- - - -
- -
- -
- - static dump (line 548) -
- - -

Dump information about a variable

-
    -
  • access: public
  • -
- -
- static void - - dump - - ( $data, mixed $data,...) -
- -
    -
  • - mixed - $data,...
  • -
  • - - $data
  • -
- - -
- -
- -
- - static enable (line 736) -
- - -

Enable Krumo

-
    -
  • access: public
  • -
- -
- static boolean - - enable - - () -
- - - -
- -
- -
- - static env (line 465) -
- - -

Prints a list of all the values from the $_ENV array.

-
    -
  • access: public
  • -
- -
- static void - - env - - () -
- - - -
- -
- -
- - static extensions (line 221) -
- - -

Prints a list of all currently loaded PHP extensions.

-
    -
  • access: public
  • -
- -
- static void - - extensions - - () -
- - - -
- -
- -
- - static functions (line 173) -
- - -

Prints a list of all currently declared functions.

-
    -
  • access: public
  • -
- -
- static void - - functions - - () -
- - - -
- -
- -
- - static get (line 369) -
- - -

Prints a list of all the values from the $_GET array.

-
    -
  • access: public
  • -
- -
- static void - - get - - () -
- - - -
- -
- -
- - static headers (line 245) -
- - -

Prints a list of all HTTP request headers.

-
    -
  • access: public
  • -
- -
- static void - - headers - - () -
- - - -
- -
- -
- - static includes (line 149) -
- - -

Prints a list of all currently included (or required) files.

-
    -
  • access: public
  • -
- -
- static void - - includes - - () -
- - - -
- -
- -
- - static ini (line 515) -
- - -

Prints a list of all the values from an INI file.

-
    -
  • access: public
  • -
- -
- static void - - ini - - (string $ini_file) -
- -
    -
  • - string - $ini_file
  • -
- - -
- -
- -
- - static interfaces (line 125) -
- - -

Prints a list of all currently declared interfaces (PHP5 only).

-
    -
  • access: public
  • -
- -
- static void - - interfaces - - () -
- - - -
- -
- -
- - static path (line 321) -
- - -

Prints a list of the specified directories under your include_path option.

-
    -
  • access: public
  • -
- -
- static void - - path - - () -
- - - -
- -
- -
- - static phpini (line 269) -
- - -

Prints a list of the configuration settings read from php.ini

-
    -
  • access: public
  • -
- -
- static void - - phpini - - () -
- - - -
- -
- -
- - static post (line 393) -
- - -

Prints a list of all the values from the $_POST array.

-
    -
  • access: public
  • -
- -
- static void - - post - - () -
- - - -
- -
- -
- - static request (line 345) -
- - -

Prints a list of all the values from the $_REQUEST array.

-
    -
  • access: public
  • -
- -
- static void - - request - - () -
- - - -
- -
- -
- - static server (line 417) -
- - -

Prints a list of all the values from the $_SERVER array.

-
    -
  • access: public
  • -
- -
- static void - - server - - () -
- - - -
- -
- -
- - static session (line 489) -
- - -

Prints a list of all the values from the $_SESSION array.

-
    -
  • access: public
  • -
- -
- static void - - session - - () -
- - - -
- -
- -
- - static version (line 70) -
- - -

Return Krumo version

-
    -
  • access: public
  • -
- -
- static string - - version - - () -
- - - -
- -
-
- - -

- Documentation generated on Sun, 02 Dec 2007 09:43:24 +0200 by phpDocumentor 1.4.0a2 -

-
- \ No newline at end of file + + + + + + Docs For Class krumo + + + + + +
+ +

 Class krumo

+ + +
+
Description
+ +
+ +

Krumo API

+

This class stores the Krumo API for rendering and displaying the structured information it is reporting

+

+ Located in /class.krumo.php (line 61) +

+ + +

+
+    
+
+ + + + + +
+
Method Summary
+ +
+
+ +
+  + static void + backtrace + () +
+ +
+  + static void + classes + () +
+ +
+  + static void + conf + () +
+ +
+  + static void + cookie + () +
+ +
+  + static void + defines + () +
+ +
+  + static boolean + disable + () +
+ +
+  + static void + dump + ( $data, mixed $data,...) +
+ +
+  + static boolean + enable + () +
+ +
+  + static void + env + () +
+ +
+  + static void + extensions + () +
+ +
+  + static void + functions + () +
+ +
+  + static void + get + () +
+ +
+  + static void + headers + () +
+ +
+  + static void + includes + () +
+ +
+  + static void + ini + (string $ini_file) +
+ +
+  + static void + interfaces + () +
+ +
+  + static void + path + () +
+ +
+  + static void + phpini + () +
+ +
+  + static void + post + () +
+ +
+  + static void + request + () +
+ +
+  + static void + server + () +
+ +
+  + static void + session + () +
+ +
+  + static string + version + () +
+
+
+
+ + + +
+
Methods
+ +
+ + +
+ +
+ + static backtrace (line 82) +
+ + +

Prints a debug backtrace

+
    +
  • access: public
  • +
+ +
+ static void + + backtrace + + () +
+ + + +
+ +
+ +
+ + static classes (line 101) +
+ + +

Prints a list of all currently declared classes.

+
    +
  • access: public
  • +
+ +
+ static void + + classes + + () +
+ + + +
+ +
+ +
+ + static conf (line 297) +
+ + +

Prints a list of all your configuration settings.

+
    +
  • access: public
  • +
+ +
+ static void + + conf + + () +
+ + + +
+ +
+ +
+ + static cookie (line 441) +
+ + +

Prints a list of all the values from the $_COOKIE array.

+
    +
  • access: public
  • +
+ +
+ static void + + cookie + + () +
+ + + +
+ +
+ +
+ + static defines (line 197) +
+ + +

Prints a list of all currently declared constants.

+
    +
  • access: public
  • +
+ +
+ static void + + defines + + () +
+ + + +
+ +
+ +
+ + static disable (line 747) +
+ + +

Disable Krumo

+
    +
  • access: public
  • +
+ +
+ static boolean + + disable + + () +
+ + + +
+ +
+ +
+ + static dump (line 548) +
+ + +

Dump information about a variable

+
    +
  • access: public
  • +
+ +
+ static void + + dump + + ( $data, mixed $data,...) +
+ +
    +
  • + mixed + $data,...
  • +
  • + + $data
  • +
+ + +
+ +
+ +
+ + static enable (line 736) +
+ + +

Enable Krumo

+
    +
  • access: public
  • +
+ +
+ static boolean + + enable + + () +
+ + + +
+ +
+ +
+ + static env (line 465) +
+ + +

Prints a list of all the values from the $_ENV array.

+
    +
  • access: public
  • +
+ +
+ static void + + env + + () +
+ + + +
+ +
+ +
+ + static extensions (line 221) +
+ + +

Prints a list of all currently loaded PHP extensions.

+
    +
  • access: public
  • +
+ +
+ static void + + extensions + + () +
+ + + +
+ +
+ +
+ + static functions (line 173) +
+ + +

Prints a list of all currently declared functions.

+
    +
  • access: public
  • +
+ +
+ static void + + functions + + () +
+ + + +
+ +
+ +
+ + static get (line 369) +
+ + +

Prints a list of all the values from the $_GET array.

+
    +
  • access: public
  • +
+ +
+ static void + + get + + () +
+ + + +
+ +
+ +
+ + static headers (line 245) +
+ + +

Prints a list of all HTTP request headers.

+
    +
  • access: public
  • +
+ +
+ static void + + headers + + () +
+ + + +
+ +
+ +
+ + static includes (line 149) +
+ + +

Prints a list of all currently included (or required) files.

+
    +
  • access: public
  • +
+ +
+ static void + + includes + + () +
+ + + +
+ +
+ +
+ + static ini (line 515) +
+ + +

Prints a list of all the values from an INI file.

+
    +
  • access: public
  • +
+ +
+ static void + + ini + + (string $ini_file) +
+ +
    +
  • + string + $ini_file
  • +
+ + +
+ +
+ +
+ + static interfaces (line 125) +
+ + +

Prints a list of all currently declared interfaces (PHP5 only).

+
    +
  • access: public
  • +
+ +
+ static void + + interfaces + + () +
+ + + +
+ +
+ +
+ + static path (line 321) +
+ + +

Prints a list of the specified directories under your include_path option.

+
    +
  • access: public
  • +
+ +
+ static void + + path + + () +
+ + + +
+ +
+ +
+ + static phpini (line 269) +
+ + +

Prints a list of the configuration settings read from php.ini

+
    +
  • access: public
  • +
+ +
+ static void + + phpini + + () +
+ + + +
+ +
+ +
+ + static post (line 393) +
+ + +

Prints a list of all the values from the $_POST array.

+
    +
  • access: public
  • +
+ +
+ static void + + post + + () +
+ + + +
+ +
+ +
+ + static request (line 345) +
+ + +

Prints a list of all the values from the $_REQUEST array.

+
    +
  • access: public
  • +
+ +
+ static void + + request + + () +
+ + + +
+ +
+ +
+ + static server (line 417) +
+ + +

Prints a list of all the values from the $_SERVER array.

+
    +
  • access: public
  • +
+ +
+ static void + + server + + () +
+ + + +
+ +
+ +
+ + static session (line 489) +
+ + +

Prints a list of all the values from the $_SESSION array.

+
    +
  • access: public
  • +
+ +
+ static void + + session + + () +
+ + + +
+ +
+ +
+ + static version (line 70) +
+ + +

Return Krumo version

+
    +
  • access: public
  • +
+ +
+ static string + + version + + () +
+ + + +
+ +
+
+ + +

+ Documentation generated on Sun, 02 Dec 2007 09:43:24 +0200 by phpDocumentor 1.4.0a2 +

+
+ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/blank.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/blank.html old mode 100755 new mode 100644 index 98c96360e..cddfbe5b9 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/blank.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/blank.html @@ -1,13 +1,13 @@ - - - Krumo - - - - -

Krumo

-Welcome to Krumo!
-
-This documentation was generated by phpDocumentor v1.4.0a2
- - \ No newline at end of file + + + Krumo + + + + +

Krumo

+Welcome to Krumo!
+
+This documentation was generated by phpDocumentor v1.4.0a2
+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/classtrees_Krumo.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/classtrees_Krumo.html old mode 100755 new mode 100644 index 8123084b9..2c927b1a6 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/classtrees_Krumo.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/classtrees_Krumo.html @@ -1,23 +1,24 @@ - - - - - - - - - - - -

- -

-

Root class krumo

+ + + + + + + + + + + + +

+ +

+

Root class krumo

- -

- Documentation generated on Sun, 02 Dec 2007 09:43:24 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + +

+ Documentation generated on Sun, 02 Dec 2007 09:43:24 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex.html old mode 100755 new mode 100644 index bc89b7a34..a2a43cfb0 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex.html @@ -1,392 +1,394 @@ - - - - - - - - - - -

Full index

-

Package indexes

- -
-
- b - c - d - e - f - g - h - i - k - p - r - s - v -
- - -
-
b
- -
-
-
-
- Method - backtrace -
-
-
krumo::backtrace() in class.krumo.php
-
Prints a debug backtrace
-
-
- -
-
c
- -
-
-
-
- Page - class.krumo.php -
-
-
class.krumo.php in class.krumo.php
-
-
- Method - classes -
-
-
krumo::classes() in class.krumo.php
-
Prints a list of all currently declared classes.
-
-
- Method - conf -
-
-
krumo::conf() in class.krumo.php
-
Prints a list of all your configuration settings.
-
-
- Method - cookie -
-
-
krumo::cookie() in class.krumo.php
-
Prints a list of all the values from the $_COOKIE array.
-
-
- -
-
d
- -
-
-
-
- Method - defines -
-
-
krumo::defines() in class.krumo.php
-
Prints a list of all currently declared constants.
-
-
- Constant - DIR_SEP -
-
-
DIR_SEP in class.krumo.php
-
backward compatibility: the DIR_SEP constant isn't used anymore
-
-
- Method - disable -
-
-
krumo::disable() in class.krumo.php
-
Disable Krumo
-
-
- Method - dump -
-
-
krumo::dump() in class.krumo.php
-
Dump information about a variable
-
-
- -
-
e
- -
-
-
-
- Method - enable -
-
-
krumo::enable() in class.krumo.php
-
Enable Krumo
-
-
- Method - env -
-
-
krumo::env() in class.krumo.php
-
Prints a list of all the values from the $_ENV array.
-
-
- Method - extensions -
-
-
krumo::extensions() in class.krumo.php
-
Prints a list of all currently loaded PHP extensions.
-
-
- -
-
f
- -
-
-
-
- Method - functions -
-
-
krumo::functions() in class.krumo.php
-
Prints a list of all currently declared functions.
-
-
- -
-
g
- -
-
-
-
- Method - get -
-
-
krumo::get() in class.krumo.php
-
Prints a list of all the values from the $_GET array.
-
-
- -
-
h
- -
-
-
-
- Method - headers -
-
-
krumo::headers() in class.krumo.php
-
Prints a list of all HTTP request headers.
-
-
- -
-
i
- -
-
-
-
- Method - includes -
-
-
krumo::includes() in class.krumo.php
-
Prints a list of all currently included (or required) files.
-
-
- Method - ini -
-
-
krumo::ini() in class.krumo.php
-
Prints a list of all the values from an INI file.
-
-
- Method - interfaces -
-
-
krumo::interfaces() in class.krumo.php
-
Prints a list of all currently declared interfaces (PHP5 only).
-
-
- -
-
k
- -
-
-
-
- Function - krumo -
-
-
krumo() in class.krumo.php
-
Alias of krumo::dump()
-
-
- Class - krumo -
-
-
krumo in class.krumo.php
-
Krumo API
-
-
- Constant - KRUMO_DIR -
-
-
KRUMO_DIR in class.krumo.php
-
Set the KRUMO_DIR constant up with the absolute path to Krumo files. If it is not defined, include_path will be used. Set KRUMO_DIR only if any other module or application has not already set it up.
-
-
- Constant - KRUMO_TRUNCATE_LENGTH -
-
-
KRUMO_TRUNCATE_LENGTH in class.krumo.php
-
This constant sets the maximum strings of strings that will be shown as they are. Longer strings will be truncated with this length, and their `full form` will be shown in a child node.
-
-
- -
-
p
- -
-
-
-
- Method - path -
-
-
krumo::path() in class.krumo.php
-
Prints a list of the specified directories under your include_path option.
-
-
- Constant - PATH_SEPARATOR -
-
-
PATH_SEPARATOR in class.krumo.php
-
backward compatibility: the PATH_SEPARATOR constant is availble since 4.3.0RC2
-
-
- Method - phpini -
-
-
krumo::phpini() in class.krumo.php
-
Prints a list of the configuration settings read from php.ini
-
-
- Method - post -
-
-
krumo::post() in class.krumo.php
-
Prints a list of all the values from the $_POST array.
-
-
- -
-
r
- -
-
-
-
- Method - request -
-
-
krumo::request() in class.krumo.php
-
Prints a list of all the values from the $_REQUEST array.
-
-
- -
-
s
- -
-
-
-
- Method - server -
-
-
krumo::server() in class.krumo.php
-
Prints a list of all the values from the $_SERVER array.
-
-
- Method - session -
-
-
krumo::session() in class.krumo.php
-
Prints a list of all the values from the $_SESSION array.
-
-
- -
-
v
- -
-
-
-
- Method - version -
-
-
krumo::version() in class.krumo.php
-
Return Krumo version
-
-
- -
- b - c - d - e - f - g - h - i - k - p - r - s - v -
- \ No newline at end of file + + + + + + + + + + + +

Full index

+

Package indexes

+ +
+
+ b + c + d + e + f + g + h + i + k + p + r + s + v +
+ + +
+
b
+ +
+
+
+
+ Method + backtrace +
+
+
krumo::backtrace() in class.krumo.php
+
Prints a debug backtrace
+
+
+ +
+
c
+ +
+
+
+
+ Page + class.krumo.php +
+
+
class.krumo.php in class.krumo.php
+
+
+ Method + classes +
+
+
krumo::classes() in class.krumo.php
+
Prints a list of all currently declared classes.
+
+
+ Method + conf +
+
+
krumo::conf() in class.krumo.php
+
Prints a list of all your configuration settings.
+
+
+ Method + cookie +
+
+
krumo::cookie() in class.krumo.php
+
Prints a list of all the values from the $_COOKIE array.
+
+
+ +
+
d
+ +
+
+
+
+ Method + defines +
+
+
krumo::defines() in class.krumo.php
+
Prints a list of all currently declared constants.
+
+
+ Constant + DIR_SEP +
+
+
DIR_SEP in class.krumo.php
+
backward compatibility: the DIR_SEP constant isn't used anymore
+
+
+ Method + disable +
+
+
krumo::disable() in class.krumo.php
+
Disable Krumo
+
+
+ Method + dump +
+
+
krumo::dump() in class.krumo.php
+
Dump information about a variable
+
+
+ +
+
e
+ +
+
+
+
+ Method + enable +
+
+
krumo::enable() in class.krumo.php
+
Enable Krumo
+
+
+ Method + env +
+
+
krumo::env() in class.krumo.php
+
Prints a list of all the values from the $_ENV array.
+
+
+ Method + extensions +
+
+
krumo::extensions() in class.krumo.php
+
Prints a list of all currently loaded PHP extensions.
+
+
+ +
+
f
+ +
+
+
+
+ Method + functions +
+
+
krumo::functions() in class.krumo.php
+
Prints a list of all currently declared functions.
+
+
+ +
+
g
+ +
+
+
+
+ Method + get +
+
+
krumo::get() in class.krumo.php
+
Prints a list of all the values from the $_GET array.
+
+
+ +
+
h
+ +
+
+
+
+ Method + headers +
+
+
krumo::headers() in class.krumo.php
+
Prints a list of all HTTP request headers.
+
+
+ +
+
i
+ +
+
+
+
+ Method + includes +
+
+
krumo::includes() in class.krumo.php
+
Prints a list of all currently included (or required) files.
+
+
+ Method + ini +
+
+
krumo::ini() in class.krumo.php
+
Prints a list of all the values from an INI file.
+
+
+ Method + interfaces +
+
+
krumo::interfaces() in class.krumo.php
+
Prints a list of all currently declared interfaces (PHP5 only).
+
+
+ +
+
k
+ +
+
+
+
+ Function + krumo +
+
+
krumo() in class.krumo.php
+
Alias of krumo::dump()
+
+
+ Class + krumo +
+
+
krumo in class.krumo.php
+
Krumo API
+
+
+ Constant + KRUMO_DIR +
+
+
KRUMO_DIR in class.krumo.php
+
Set the KRUMO_DIR constant up with the absolute path to Krumo files. If it is not defined, include_path will be used. Set KRUMO_DIR only if any other module or application has not already set it up.
+
+
+ Constant + KRUMO_TRUNCATE_LENGTH +
+
+
KRUMO_TRUNCATE_LENGTH in class.krumo.php
+
This constant sets the maximum strings of strings that will be shown as they are. Longer strings will be truncated with this length, and their `full form` will be shown in a child node.
+
+
+ +
+
p
+ +
+
+
+
+ Method + path +
+
+
krumo::path() in class.krumo.php
+
Prints a list of the specified directories under your include_path option.
+
+
+ Constant + PATH_SEPARATOR +
+
+
PATH_SEPARATOR in class.krumo.php
+
backward compatibility: the PATH_SEPARATOR constant is availble since 4.3.0RC2
+
+
+ Method + phpini +
+
+
krumo::phpini() in class.krumo.php
+
Prints a list of the configuration settings read from php.ini
+
+
+ Method + post +
+
+
krumo::post() in class.krumo.php
+
Prints a list of all the values from the $_POST array.
+
+
+ +
+
r
+ +
+
+
+
+ Method + request +
+
+
krumo::request() in class.krumo.php
+
Prints a list of all the values from the $_REQUEST array.
+
+
+ +
+
s
+ +
+
+
+
+ Method + server +
+
+
krumo::server() in class.krumo.php
+
Prints a list of all the values from the $_SERVER array.
+
+
+ Method + session +
+
+
krumo::session() in class.krumo.php
+
Prints a list of all the values from the $_SESSION array.
+
+
+ +
+
v
+ +
+
+
+
+ Method + version +
+
+
krumo::version() in class.krumo.php
+
Return Krumo version
+
+
+ +
+ b + c + d + e + f + g + h + i + k + p + r + s + v +
+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex_Krumo.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex_Krumo.html old mode 100755 new mode 100644 index 39e747721..3cd941fdf --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex_Krumo.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/elementindex_Krumo.html @@ -1,389 +1,391 @@ - - - - - - - - - - -

[Krumo] element index

-All elements -
-
- b - c - d - e - f - g - h - i - k - p - r - s - v -
- - -
-
b
- -
-
-
-
- Method - backtrace -
-
-
krumo::backtrace() in class.krumo.php
-
Prints a debug backtrace
-
-
- -
-
c
- -
-
-
-
- Page - class.krumo.php -
-
-
class.krumo.php in class.krumo.php
-
-
- Method - classes -
-
-
krumo::classes() in class.krumo.php
-
Prints a list of all currently declared classes.
-
-
- Method - conf -
-
-
krumo::conf() in class.krumo.php
-
Prints a list of all your configuration settings.
-
-
- Method - cookie -
-
-
krumo::cookie() in class.krumo.php
-
Prints a list of all the values from the $_COOKIE array.
-
-
- -
-
d
- -
-
-
-
- Method - defines -
-
-
krumo::defines() in class.krumo.php
-
Prints a list of all currently declared constants.
-
-
- Constant - DIR_SEP -
-
-
DIR_SEP in class.krumo.php
-
backward compatibility: the DIR_SEP constant isn't used anymore
-
-
- Method - disable -
-
-
krumo::disable() in class.krumo.php
-
Disable Krumo
-
-
- Method - dump -
-
-
krumo::dump() in class.krumo.php
-
Dump information about a variable
-
-
- -
-
e
- -
-
-
-
- Method - enable -
-
-
krumo::enable() in class.krumo.php
-
Enable Krumo
-
-
- Method - env -
-
-
krumo::env() in class.krumo.php
-
Prints a list of all the values from the $_ENV array.
-
-
- Method - extensions -
-
-
krumo::extensions() in class.krumo.php
-
Prints a list of all currently loaded PHP extensions.
-
-
- -
-
f
- -
-
-
-
- Method - functions -
-
-
krumo::functions() in class.krumo.php
-
Prints a list of all currently declared functions.
-
-
- -
-
g
- -
-
-
-
- Method - get -
-
-
krumo::get() in class.krumo.php
-
Prints a list of all the values from the $_GET array.
-
-
- -
-
h
- -
-
-
-
- Method - headers -
-
-
krumo::headers() in class.krumo.php
-
Prints a list of all HTTP request headers.
-
-
- -
-
i
- -
-
-
-
- Method - includes -
-
-
krumo::includes() in class.krumo.php
-
Prints a list of all currently included (or required) files.
-
-
- Method - ini -
-
-
krumo::ini() in class.krumo.php
-
Prints a list of all the values from an INI file.
-
-
- Method - interfaces -
-
-
krumo::interfaces() in class.krumo.php
-
Prints a list of all currently declared interfaces (PHP5 only).
-
-
- -
-
k
- -
-
-
-
- Function - krumo -
-
-
krumo() in class.krumo.php
-
Alias of krumo::dump()
-
-
- Class - krumo -
-
-
krumo in class.krumo.php
-
Krumo API
-
-
- Constant - KRUMO_DIR -
-
-
KRUMO_DIR in class.krumo.php
-
Set the KRUMO_DIR constant up with the absolute path to Krumo files. If it is not defined, include_path will be used. Set KRUMO_DIR only if any other module or application has not already set it up.
-
-
- Constant - KRUMO_TRUNCATE_LENGTH -
-
-
KRUMO_TRUNCATE_LENGTH in class.krumo.php
-
This constant sets the maximum strings of strings that will be shown as they are. Longer strings will be truncated with this length, and their `full form` will be shown in a child node.
-
-
- -
-
p
- -
-
-
-
- Method - path -
-
-
krumo::path() in class.krumo.php
-
Prints a list of the specified directories under your include_path option.
-
-
- Constant - PATH_SEPARATOR -
-
-
PATH_SEPARATOR in class.krumo.php
-
backward compatibility: the PATH_SEPARATOR constant is availble since 4.3.0RC2
-
-
- Method - phpini -
-
-
krumo::phpini() in class.krumo.php
-
Prints a list of the configuration settings read from php.ini
-
-
- Method - post -
-
-
krumo::post() in class.krumo.php
-
Prints a list of all the values from the $_POST array.
-
-
- -
-
r
- -
-
-
-
- Method - request -
-
-
krumo::request() in class.krumo.php
-
Prints a list of all the values from the $_REQUEST array.
-
-
- -
-
s
- -
-
-
-
- Method - server -
-
-
krumo::server() in class.krumo.php
-
Prints a list of all the values from the $_SERVER array.
-
-
- Method - session -
-
-
krumo::session() in class.krumo.php
-
Prints a list of all the values from the $_SESSION array.
-
-
- -
-
v
- -
-
-
-
- Method - version -
-
-
krumo::version() in class.krumo.php
-
Return Krumo version
-
-
- -
- b - c - d - e - f - g - h - i - k - p - r - s - v -
- \ No newline at end of file + + + + + + + + + + + +

[Krumo] element index

+All elements +
+
+ b + c + d + e + f + g + h + i + k + p + r + s + v +
+ + +
+
b
+ +
+
+
+
+ Method + backtrace +
+
+
krumo::backtrace() in class.krumo.php
+
Prints a debug backtrace
+
+
+ +
+
c
+ +
+
+
+
+ Page + class.krumo.php +
+
+
class.krumo.php in class.krumo.php
+
+
+ Method + classes +
+
+
krumo::classes() in class.krumo.php
+
Prints a list of all currently declared classes.
+
+
+ Method + conf +
+
+
krumo::conf() in class.krumo.php
+
Prints a list of all your configuration settings.
+
+
+ Method + cookie +
+
+
krumo::cookie() in class.krumo.php
+
Prints a list of all the values from the $_COOKIE array.
+
+
+ +
+
d
+ +
+
+
+
+ Method + defines +
+
+
krumo::defines() in class.krumo.php
+
Prints a list of all currently declared constants.
+
+
+ Constant + DIR_SEP +
+
+
DIR_SEP in class.krumo.php
+
backward compatibility: the DIR_SEP constant isn't used anymore
+
+
+ Method + disable +
+
+
krumo::disable() in class.krumo.php
+
Disable Krumo
+
+
+ Method + dump +
+
+
krumo::dump() in class.krumo.php
+
Dump information about a variable
+
+
+ +
+
e
+ +
+
+
+
+ Method + enable +
+
+
krumo::enable() in class.krumo.php
+
Enable Krumo
+
+
+ Method + env +
+
+
krumo::env() in class.krumo.php
+
Prints a list of all the values from the $_ENV array.
+
+
+ Method + extensions +
+
+
krumo::extensions() in class.krumo.php
+
Prints a list of all currently loaded PHP extensions.
+
+
+ +
+
f
+ +
+
+
+
+ Method + functions +
+
+
krumo::functions() in class.krumo.php
+
Prints a list of all currently declared functions.
+
+
+ +
+
g
+ +
+
+
+
+ Method + get +
+
+
krumo::get() in class.krumo.php
+
Prints a list of all the values from the $_GET array.
+
+
+ +
+
h
+ +
+
+
+
+ Method + headers +
+
+
krumo::headers() in class.krumo.php
+
Prints a list of all HTTP request headers.
+
+
+ +
+
i
+ +
+
+
+
+ Method + includes +
+
+
krumo::includes() in class.krumo.php
+
Prints a list of all currently included (or required) files.
+
+
+ Method + ini +
+
+
krumo::ini() in class.krumo.php
+
Prints a list of all the values from an INI file.
+
+
+ Method + interfaces +
+
+
krumo::interfaces() in class.krumo.php
+
Prints a list of all currently declared interfaces (PHP5 only).
+
+
+ +
+
k
+ +
+
+
+
+ Function + krumo +
+
+
krumo() in class.krumo.php
+
Alias of krumo::dump()
+
+
+ Class + krumo +
+
+
krumo in class.krumo.php
+
Krumo API
+
+
+ Constant + KRUMO_DIR +
+
+
KRUMO_DIR in class.krumo.php
+
Set the KRUMO_DIR constant up with the absolute path to Krumo files. If it is not defined, include_path will be used. Set KRUMO_DIR only if any other module or application has not already set it up.
+
+
+ Constant + KRUMO_TRUNCATE_LENGTH +
+
+
KRUMO_TRUNCATE_LENGTH in class.krumo.php
+
This constant sets the maximum strings of strings that will be shown as they are. Longer strings will be truncated with this length, and their `full form` will be shown in a child node.
+
+
+ +
+
p
+ +
+
+
+
+ Method + path +
+
+
krumo::path() in class.krumo.php
+
Prints a list of the specified directories under your include_path option.
+
+
+ Constant + PATH_SEPARATOR +
+
+
PATH_SEPARATOR in class.krumo.php
+
backward compatibility: the PATH_SEPARATOR constant is availble since 4.3.0RC2
+
+
+ Method + phpini +
+
+
krumo::phpini() in class.krumo.php
+
Prints a list of the configuration settings read from php.ini
+
+
+ Method + post +
+
+
krumo::post() in class.krumo.php
+
Prints a list of all the values from the $_POST array.
+
+
+ +
+
r
+ +
+
+
+
+ Method + request +
+
+
krumo::request() in class.krumo.php
+
Prints a list of all the values from the $_REQUEST array.
+
+
+ +
+
s
+ +
+
+
+
+ Method + server +
+
+
krumo::server() in class.krumo.php
+
Prints a list of all the values from the $_SERVER array.
+
+
+ Method + session +
+
+
krumo::session() in class.krumo.php
+
Prints a list of all the values from the $_SESSION array.
+
+
+ +
+
v
+ +
+
+
+
+ Method + version +
+
+
krumo::version() in class.krumo.php
+
Return Krumo version
+
+
+ +
+ b + c + d + e + f + g + h + i + k + p + r + s + v +
+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/errors.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/errors.html old mode 100755 new mode 100644 index cf21fd427..c53acedd8 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/errors.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/errors.html @@ -1,15 +1,16 @@ - - - - - - phpDocumentor Parser Errors and Warnings - - - - Post-parsing
-

- Documentation generated on Sun, 02 Dec 2007 09:43:25 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + phpDocumentor Parser Errors and Warnings + + + + + Post-parsing
+

+ Documentation generated on Sun, 02 Dec 2007 09:43:25 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/index.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/index.html old mode 100755 new mode 100644 index 8276a705f..89518cef8 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/index.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/index.html @@ -1,24 +1,24 @@ - - - - - - Krumo - - - - - - - - - - - <H2>Frame Alert</H2> - <P>This document is designed to be viewed using the frames feature. - If you see this message, you are using a non-frame-capable web client.</P> - - - \ No newline at end of file + + + + + + Krumo + + + + + + + + + + + <H2>Frame Alert</H2> + <P>This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client.</P> + + + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/li_Krumo.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/li_Krumo.html old mode 100755 new mode 100644 index f353e8db6..d36927084 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/li_Krumo.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/li_Krumo.html @@ -1,155 +1,156 @@ - - - - - - - - - - - - -

Krumo

-
- -
-

- Generated by - phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + + + + + + + + +

Krumo

+
+ +
+

+ Generated by + phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/banner.css b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/banner.css old mode 100755 new mode 100644 index 1b7fa8a24..19a383c39 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/banner.css +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/banner.css @@ -1,32 +1,32 @@ -body -{ - background-color: #EEEEEE; - margin: 0px; - padding: 0px; -} - -/* Banner (top bar) classes */ - -.banner { } - -.banner-menu -{ - clear: both; - padding: .5em; - border-top: 2px solid #AAAAAA; -} - -.banner-title -{ - text-align: right; - font-size: 20pt; - font-weight: bold; - margin: .2em; -} - -.package-selector -{ - background-color: #DDDDDD; - border: 1px solid #AAAAAA; - color: #000090; -} +body +{ + background-color: #EEEEEE; + margin: 0px; + padding: 0px; +} + +/* Banner (top bar) classes */ + +.banner { } + +.banner-menu +{ + clear: both; + padding: .5em; + border-top: 2px solid #AAAAAA; +} + +.banner-title +{ + text-align: right; + font-size: 20pt; + font-weight: bold; + margin: .2em; +} + +.package-selector +{ + background-color: #DDDDDD; + border: 1px solid #AAAAAA; + color: #000090; +} diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractClass.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractClass.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractClass_logo.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractClass_logo.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractMethod.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractMethod.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractPrivateClass.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractPrivateClass.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractPrivateClass_logo.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractPrivateClass_logo.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractPrivateMethod.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/AbstractPrivateMethod.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Class.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Class.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Class_logo.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Class_logo.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Constant.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Constant.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Constructor.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Constructor.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Destructor.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Destructor.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Function.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Function.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Global.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Global.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/I.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/I.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Index.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Index.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/L.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/L.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Lminus.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Lminus.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Lplus.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Lplus.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Method.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Method.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Page.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Page.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Page_logo.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Page_logo.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateClass.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateClass.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateClass_logo.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateClass_logo.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateMethod.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateMethod.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateVariable.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/PrivateVariable.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/T.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/T.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Tminus.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Tminus.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Tplus.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Tplus.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Variable.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/Variable.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/blank.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/blank.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/class_folder.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/class_folder.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/empty.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/empty.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/file.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/file.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/folder.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/folder.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/function_folder.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/function_folder.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/minus.gif b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/minus.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/next_button.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/next_button.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/next_button_disabled.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/next_button_disabled.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/package.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/package.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/package_folder.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/package_folder.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/plus.gif b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/plus.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/previous_button.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/previous_button.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/previous_button_disabled.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/previous_button_disabled.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/private_class_logo.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/private_class_logo.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/tutorial.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/tutorial.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/tutorial_folder.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/tutorial_folder.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/up_button.png b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/images/up_button.png old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/lib/classTree.js b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/lib/classTree.js old mode 100755 new mode 100644 index 5989426f0..63a1b3003 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/lib/classTree.js +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/lib/classTree.js @@ -1,454 +1,454 @@ -/*----------------------------------------\ -| Cross Browser Tree Widget 1.1 | -|-----------------------------------------| -| Created by Emil A. Eklund (eae@eae.net) | -| For WebFX (http://webfx.eae.net/) | -|-----------------------------------------| -| This script is provided as is without | -| any warranty whatsoever. It may be used | -| free of charge for non commerical sites | -| For commerical use contact the author | -| of this script for further details. | -|-----------------------------------------| -| Created 2000-12-11 | Updated 2001-09-06 | -\----------------------------------------*/ - -var webFXTreeConfig = { - rootIcon : 'media/images/empty.png', - openRootIcon : 'media/images/empty.png', - folderIcon : 'media/images/empty.png', - openFolderIcon : 'media/images/empty.png', - fileIcon : 'media/images/empty.png', - iIcon : 'media/images/I.png', - lIcon : 'media/images/L.png', - lMinusIcon : 'media/images/Lminus.png', - lPlusIcon : 'media/images/Lplus.png', - tIcon : 'media/images/T.png', - tMinusIcon : 'media/images/Tminus.png', - tPlusIcon : 'media/images/Tplus.png', - blankIcon : 'media/images/blank.png', - defaultText : 'Tree Item', - defaultAction : 'javascript:void(0);', - defaultTarget : 'right', - defaultBehavior : 'classic' -}; - -var webFXTreeHandler = { - idCounter : 0, - idPrefix : "webfx-tree-object-", - all : {}, - behavior : null, - selected : null, - getId : function() { return this.idPrefix + this.idCounter++; }, - toggle : function (oItem) { this.all[oItem.id.replace('-plus','')].toggle(); }, - select : function (oItem) { this.all[oItem.id.replace('-icon','')].select(); }, - focus : function (oItem) { this.all[oItem.id.replace('-anchor','')].focus(); }, - blur : function (oItem) { this.all[oItem.id.replace('-anchor','')].blur(); }, - keydown : function (oItem) { return this.all[oItem.id].keydown(window.event.keyCode); }, - cookies : new WebFXCookie() -}; - -/* - * WebFXCookie class - */ - -function WebFXCookie() { - if (document.cookie.length) { this.cookies = ' ' + document.cookie; } -} - -WebFXCookie.prototype.setCookie = function (key, value) { - document.cookie = key + "=" + escape(value); -} - -WebFXCookie.prototype.getCookie = function (key) { - if (this.cookies) { - var start = this.cookies.indexOf(' ' + key + '='); - if (start == -1) { return null; } - var end = this.cookies.indexOf(";", start); - if (end == -1) { end = this.cookies.length; } - end -= start; - var cookie = this.cookies.substr(start,end); - return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1)); - } - else { return null; } -} - -/* - * WebFXTreeAbstractNode class - */ - -function WebFXTreeAbstractNode(sText, sAction, sTarget) { - this.childNodes = []; - this.id = webFXTreeHandler.getId(); - this.text = sText || webFXTreeConfig.defaultText; - this.action = sAction || webFXTreeConfig.defaultAction; - this.targetWindow = sTarget || webFXTreeConfig.defaultTarget; - this._last = false; - webFXTreeHandler.all[this.id] = this; -} - -WebFXTreeAbstractNode.prototype.add = function (node) { - node.parentNode = this; - this.childNodes[this.childNodes.length] = node; - var root = this; - if (this.childNodes.length >=2) { - this.childNodes[this.childNodes.length -2]._last = false; - } - while (root.parentNode) { root = root.parentNode; } - if (root.rendered) { - if (this.childNodes.length >= 2) { - document.getElementById(this.childNodes[this.childNodes.length -2].id + '-plus').src = ((this.childNodes[this.childNodes.length -2].folder)?webFXTreeConfig.tMinusIcon:webFXTreeConfig.tIcon); - if (this.childNodes[this.childNodes.length -2].folder) { - this.childNodes[this.childNodes.length -2].plusIcon = webFXTreeConfig.tPlusIcon; - this.childNodes[this.childNodes.length -2].minusIcon = webFXTreeConfig.tMinusIcon; - } - this.childNodes[this.childNodes.length -2]._last = false; - } - this._last = true; - var foo = this; - while (foo.parentNode) { - for (var i = 0; i < foo.parentNode.childNodes.length; i++) { - if (foo.id == foo.parentNode.childNodes[i].id) { break; } - } - if (++i == foo.parentNode.childNodes.length) { foo.parentNode._last = true; } - else { foo.parentNode._last = false; } - foo = foo.parentNode; - } - document.getElementById(this.id + '-cont').insertAdjacentHTML("beforeEnd", node.toString()); - if ((!this.folder) && (!this.openIcon)) { - this.icon = webFXTreeConfig.folderIcon; - this.openIcon = webFXTreeConfig.openFolderIcon; - } - this.folder = true; - this.indent(); - this.expand(); - } - return node; -} - -WebFXTreeAbstractNode.prototype.toggle = function() { - if (this.folder) { - if (this.open) { this.collapse(); } - else { this.expand(); } - } -} - -WebFXTreeAbstractNode.prototype.select = function() { - document.getElementById(this.id + '-anchor').focus(); -} - -WebFXTreeAbstractNode.prototype.focus = function() { - webFXTreeHandler.selected = this; - if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.openIcon; } - document.getElementById(this.id + '-anchor').style.backgroundColor = 'highlight'; - document.getElementById(this.id + '-anchor').style.color = 'highlighttext'; - document.getElementById(this.id + '-anchor').focus(); -} - -WebFXTreeAbstractNode.prototype.blur = function() { - if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.icon; } - document.getElementById(this.id + '-anchor').style.backgroundColor = 'transparent'; - document.getElementById(this.id + '-anchor').style.color = 'menutext'; -} - -WebFXTreeAbstractNode.prototype.doExpand = function() { - if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.openIcon; } - if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'block'; } - this.open = true; - webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '1'); -} - -WebFXTreeAbstractNode.prototype.doCollapse = function() { - if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.icon; } - if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'none'; } - this.open = false; - webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '0'); -} - -WebFXTreeAbstractNode.prototype.expandAll = function() { - this.expandChildren(); - if ((this.folder) && (!this.open)) { this.expand(); } -} - -WebFXTreeAbstractNode.prototype.expandChildren = function() { - for (var i = 0; i < this.childNodes.length; i++) { - this.childNodes[i].expandAll(); -} } - -WebFXTreeAbstractNode.prototype.collapseAll = function() { - if ((this.folder) && (this.open)) { this.collapse(); } - this.collapseChildren(); -} - -WebFXTreeAbstractNode.prototype.collapseChildren = function() { - for (var i = 0; i < this.childNodes.length; i++) { - this.childNodes[i].collapseAll(); -} } - -WebFXTreeAbstractNode.prototype.indent = function(lvl, del, last, level) { - /* - * Since we only want to modify items one level below ourself, - * and since the rightmost indentation position is occupied by - * the plus icon we set this to -2 - */ - if (lvl == null) { lvl = -2; } - var state = 0; - for (var i = this.childNodes.length - 1; i >= 0 ; i--) { - state = this.childNodes[i].indent(lvl + 1, del, last, level); - if (state) { return; } - } - if (del) { - if (level >= this._level) { - if (this.folder) { - document.getElementById(this.id + '-plus').src = (this.open)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.lPlusIcon; - this.plusIcon = webFXTreeConfig.lPlusIcon; - this.minusIcon = webFXTreeConfig.lMinusIcon; - } - else { document.getElementById(this.id + '-plus').src = webFXTreeConfig.lIcon; } - return 1; - } - } - var foo = document.getElementById(this.id + '-indent-' + lvl); - if (foo) { - if ((del) && (last)) { foo._last = true; } - if (foo._last) { foo.src = webFXTreeConfig.blankIcon; } - else { foo.src = webFXTreeConfig.iIcon; } - } - return 0; -} - -/* - * WebFXTree class - */ - -function WebFXTree(sText, sAction, sBehavior, sIcon, sOpenIcon) { - this.base = WebFXTreeAbstractNode; - this.base(sText, sAction); - this.icon = sIcon || webFXTreeConfig.rootIcon; - this.openIcon = sOpenIcon || webFXTreeConfig.openRootIcon; - /* Defaults to open */ - this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '0')?false:true; - this.folder = true; - this.rendered = false; - if (!webFXTreeHandler.behavior) { webFXTreeHandler.behavior = sBehavior || webFXTreeConfig.defaultBehavior; } - this.targetWindow = 'right'; -} - -WebFXTree.prototype = new WebFXTreeAbstractNode; - -WebFXTree.prototype.setBehavior = function (sBehavior) { - webFXTreeHandler.behavior = sBehavior; -}; - -WebFXTree.prototype.getBehavior = function (sBehavior) { - return webFXTreeHandler.behavior; -}; - -WebFXTree.prototype.getSelected = function() { - if (webFXTreeHandler.selected) { return webFXTreeHandler.selected; } - else { return null; } -} - -WebFXTree.prototype.remove = function() { } - -WebFXTree.prototype.expand = function() { - this.doExpand(); -} - -WebFXTree.prototype.collapse = function() { - this.focus(); - this.doCollapse(); -} - -WebFXTree.prototype.getFirst = function() { - return null; -} - -WebFXTree.prototype.getLast = function() { - return null; -} - -WebFXTree.prototype.getNextSibling = function() { - return null; -} - -WebFXTree.prototype.getPreviousSibling = function() { - return null; -} - -WebFXTree.prototype.keydown = function(key) { - if (key == 39) { this.expand(); return false; } - if (key == 37) { this.collapse(); return false; } - if ((key == 40) && (this.open)) { this.childNodes[0].select(); return false; } - return true; -} - -WebFXTree.prototype.toString = function() { - var str = "
"; - str += "" + this.text + "
"; - str += "
"; - for (var i = 0; i < this.childNodes.length; i++) { - str += this.childNodes[i].toString(i, this.childNodes.length); - } - str += "
"; - this.rendered = true; - return str; -}; - -/* - * WebFXTreeItem class - */ - -function WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon) { - this.base = WebFXTreeAbstractNode; - this.base(sText, sAction); - /* Defaults to close */ - this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '1')?true:false; - if (eParent) { eParent.add(this); } - if (sIcon) { this.icon = sIcon; } - if (sOpenIcon) { this.openIcon = sOpenIcon; } -} - -WebFXTreeItem.prototype = new WebFXTreeAbstractNode; - -WebFXTreeItem.prototype.remove = function() { - var parentNode = this.parentNode; - var prevSibling = this.getPreviousSibling(true); - var nextSibling = this.getNextSibling(true); - var folder = this.parentNode.folder; - var last = ((nextSibling) && (nextSibling.parentNode) && (nextSibling.parentNode.id == parentNode.id))?false:true; - this.getPreviousSibling().focus(); - this._remove(); - if (parentNode.childNodes.length == 0) { - parentNode.folder = false; - parentNode.open = false; - } - if (last) { - if (parentNode.id == prevSibling.id) { - document.getElementById(parentNode.id + '-icon').src = webFXTreeConfig.fileIcon; - } - else { } - } - if ((!prevSibling.parentNode) || (prevSibling.parentNode != parentNode)) { - parentNode.indent(null, true, last, this._level); - } - if (document.getElementById(prevSibling.id + '-plus')) { - if (nextSibling) { - if ((parentNode == prevSibling) && (parentNode.getNextSibling)) { document.getElementById(prevSibling.id + '-plus').src = webFXTreeConfig.tIcon; } - else if (nextSibling.parentNode != prevSibling) { document.getElementById(prevSibling.id + '-plus').src = webFXTreeConfig.lIcon; } - } - else { document.getElementById(prevSibling.id + '-plus').src = webFXTreeConfig.lIcon; } - } -} - -WebFXTreeItem.prototype._remove = function() { - for (var i = this.childNodes.length - 1; i >= 0; i--) { - this.childNodes[i]._remove(); - } - for (var i = 0; i < this.parentNode.childNodes.length; i++) { - if (this.id == this.parentNode.childNodes[i].id) { - for (var j = i; j < this.parentNode.childNodes.length; j++) { - this.parentNode.childNodes[i] = this.parentNode.childNodes[i+1] - } - this.parentNode.childNodes.length = this.parentNode.childNodes.length - 1; - if (i + 1 == this.parentNode.childNodes.length) { this.parentNode._last = true; } - } - } - webFXTreeHandler.all[this.id] = null; - if (document.getElementById(this.id)) { - document.getElementById(this.id).innerHTML = ""; - document.getElementById(this.id).removeNode(); - } -} - -WebFXTreeItem.prototype.expand = function() { - this.doExpand(); - document.getElementById(this.id + '-plus').src = this.minusIcon; -} - -WebFXTreeItem.prototype.collapse = function() { - this.focus(); - this.doCollapse(); - document.getElementById(this.id + '-plus').src = this.plusIcon; -} - -WebFXTreeItem.prototype.getFirst = function() { - return this.childNodes[0]; -} - -WebFXTreeItem.prototype.getLast = function() { - if (this.childNodes[this.childNodes.length - 1].open) { return this.childNodes[this.childNodes.length - 1].getLast(); } - else { return this.childNodes[this.childNodes.length - 1]; } -} - -WebFXTreeItem.prototype.getNextSibling = function() { - for (var i = 0; i < this.parentNode.childNodes.length; i++) { - if (this == this.parentNode.childNodes[i]) { break; } - } - if (++i == this.parentNode.childNodes.length) { return this.parentNode.getNextSibling(); } - else { return this.parentNode.childNodes[i]; } -} - -WebFXTreeItem.prototype.getPreviousSibling = function(b) { - for (var i = 0; i < this.parentNode.childNodes.length; i++) { - if (this == this.parentNode.childNodes[i]) { break; } - } - if (i == 0) { return this.parentNode; } - else { - if ((this.parentNode.childNodes[--i].open) || (b && this.parentNode.childNodes[i].folder)) { return this.parentNode.childNodes[i].getLast(); } - else { return this.parentNode.childNodes[i]; } -} } - -WebFXTreeItem.prototype.keydown = function(key) { - if ((key == 39) && (this.folder)) { - if (!this.open) { this.expand(); return false; } - else { this.getFirst().select(); return false; } - } - else if (key == 37) { - if (this.open) { this.collapse(); return false; } - else { this.parentNode.select(); return false; } - } - else if (key == 40) { - if (this.open) { this.getFirst().select(); return false; } - else { - var sib = this.getNextSibling(); - if (sib) { sib.select(); return false; } - } } - else if (key == 38) { this.getPreviousSibling().select(); return false; } - return true; -} - -WebFXTreeItem.prototype.toString = function (nItem, nItemCount) { - var foo = this.parentNode; - var indent = ''; - if (nItem + 1 == nItemCount) { this.parentNode._last = true; } - var i = 0; - while (foo.parentNode) { - foo = foo.parentNode; - indent = "" + indent; - i++; - } - this._level = i; - if (this.childNodes.length) { this.folder = 1; } - else { this.open = false; } - if ((this.folder) || (webFXTreeHandler.behavior != 'classic')) { - if (!this.icon) { this.icon = webFXTreeConfig.folderIcon; } - if (!this.openIcon) { this.openIcon = webFXTreeConfig.openFolderIcon; } - } - else if (!this.icon) { this.icon = webFXTreeConfig.fileIcon; } - var label = this.text; - label = label.replace('<', '<'); - label = label.replace('>', '>'); - var str = "
"; - str += indent; - str += "" - str += "" + label + "
"; - str += "
"; - for (var i = 0; i < this.childNodes.length; i++) { - str += this.childNodes[i].toString(i,this.childNodes.length); - } - str += "
"; - this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon); - this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon); - return str; -} \ No newline at end of file +/*----------------------------------------\ +| Cross Browser Tree Widget 1.1 | +|-----------------------------------------| +| Created by Emil A. Eklund (eae@eae.net) | +| For WebFX (http://webfx.eae.net/) | +|-----------------------------------------| +| This script is provided as is without | +| any warranty whatsoever. It may be used | +| free of charge for non commerical sites | +| For commerical use contact the author | +| of this script for further details. | +|-----------------------------------------| +| Created 2000-12-11 | Updated 2001-09-06 | +\----------------------------------------*/ + +var webFXTreeConfig = { + rootIcon : 'media/images/empty.png', + openRootIcon : 'media/images/empty.png', + folderIcon : 'media/images/empty.png', + openFolderIcon : 'media/images/empty.png', + fileIcon : 'media/images/empty.png', + iIcon : 'media/images/I.png', + lIcon : 'media/images/L.png', + lMinusIcon : 'media/images/Lminus.png', + lPlusIcon : 'media/images/Lplus.png', + tIcon : 'media/images/T.png', + tMinusIcon : 'media/images/Tminus.png', + tPlusIcon : 'media/images/Tplus.png', + blankIcon : 'media/images/blank.png', + defaultText : 'Tree Item', + defaultAction : 'javascript:void(0);', + defaultTarget : 'right', + defaultBehavior : 'classic' +}; + +var webFXTreeHandler = { + idCounter : 0, + idPrefix : "webfx-tree-object-", + all : {}, + behavior : null, + selected : null, + getId : function() { return this.idPrefix + this.idCounter++; }, + toggle : function (oItem) { this.all[oItem.id.replace('-plus','')].toggle(); }, + select : function (oItem) { this.all[oItem.id.replace('-icon','')].select(); }, + focus : function (oItem) { this.all[oItem.id.replace('-anchor','')].focus(); }, + blur : function (oItem) { this.all[oItem.id.replace('-anchor','')].blur(); }, + keydown : function (oItem) { return this.all[oItem.id].keydown(window.event.keyCode); }, + cookies : new WebFXCookie() +}; + +/* + * WebFXCookie class + */ + +function WebFXCookie() { + if (document.cookie.length) { this.cookies = ' ' + document.cookie; } +} + +WebFXCookie.prototype.setCookie = function (key, value) { + document.cookie = key + "=" + escape(value); +} + +WebFXCookie.prototype.getCookie = function (key) { + if (this.cookies) { + var start = this.cookies.indexOf(' ' + key + '='); + if (start == -1) { return null; } + var end = this.cookies.indexOf(";", start); + if (end == -1) { end = this.cookies.length; } + end -= start; + var cookie = this.cookies.substr(start,end); + return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1)); + } + else { return null; } +} + +/* + * WebFXTreeAbstractNode class + */ + +function WebFXTreeAbstractNode(sText, sAction, sTarget) { + this.childNodes = []; + this.id = webFXTreeHandler.getId(); + this.text = sText || webFXTreeConfig.defaultText; + this.action = sAction || webFXTreeConfig.defaultAction; + this.targetWindow = sTarget || webFXTreeConfig.defaultTarget; + this._last = false; + webFXTreeHandler.all[this.id] = this; +} + +WebFXTreeAbstractNode.prototype.add = function (node) { + node.parentNode = this; + this.childNodes[this.childNodes.length] = node; + var root = this; + if (this.childNodes.length >=2) { + this.childNodes[this.childNodes.length -2]._last = false; + } + while (root.parentNode) { root = root.parentNode; } + if (root.rendered) { + if (this.childNodes.length >= 2) { + document.getElementById(this.childNodes[this.childNodes.length -2].id + '-plus').src = ((this.childNodes[this.childNodes.length -2].folder)?webFXTreeConfig.tMinusIcon:webFXTreeConfig.tIcon); + if (this.childNodes[this.childNodes.length -2].folder) { + this.childNodes[this.childNodes.length -2].plusIcon = webFXTreeConfig.tPlusIcon; + this.childNodes[this.childNodes.length -2].minusIcon = webFXTreeConfig.tMinusIcon; + } + this.childNodes[this.childNodes.length -2]._last = false; + } + this._last = true; + var foo = this; + while (foo.parentNode) { + for (var i = 0; i < foo.parentNode.childNodes.length; i++) { + if (foo.id == foo.parentNode.childNodes[i].id) { break; } + } + if (++i == foo.parentNode.childNodes.length) { foo.parentNode._last = true; } + else { foo.parentNode._last = false; } + foo = foo.parentNode; + } + document.getElementById(this.id + '-cont').insertAdjacentHTML("beforeEnd", node.toString()); + if ((!this.folder) && (!this.openIcon)) { + this.icon = webFXTreeConfig.folderIcon; + this.openIcon = webFXTreeConfig.openFolderIcon; + } + this.folder = true; + this.indent(); + this.expand(); + } + return node; +} + +WebFXTreeAbstractNode.prototype.toggle = function() { + if (this.folder) { + if (this.open) { this.collapse(); } + else { this.expand(); } + } +} + +WebFXTreeAbstractNode.prototype.select = function() { + document.getElementById(this.id + '-anchor').focus(); +} + +WebFXTreeAbstractNode.prototype.focus = function() { + webFXTreeHandler.selected = this; + if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.openIcon; } + document.getElementById(this.id + '-anchor').style.backgroundColor = 'highlight'; + document.getElementById(this.id + '-anchor').style.color = 'highlighttext'; + document.getElementById(this.id + '-anchor').focus(); +} + +WebFXTreeAbstractNode.prototype.blur = function() { + if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.icon; } + document.getElementById(this.id + '-anchor').style.backgroundColor = 'transparent'; + document.getElementById(this.id + '-anchor').style.color = 'menutext'; +} + +WebFXTreeAbstractNode.prototype.doExpand = function() { + if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.openIcon; } + if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'block'; } + this.open = true; + webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '1'); +} + +WebFXTreeAbstractNode.prototype.doCollapse = function() { + if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.icon; } + if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'none'; } + this.open = false; + webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '0'); +} + +WebFXTreeAbstractNode.prototype.expandAll = function() { + this.expandChildren(); + if ((this.folder) && (!this.open)) { this.expand(); } +} + +WebFXTreeAbstractNode.prototype.expandChildren = function() { + for (var i = 0; i < this.childNodes.length; i++) { + this.childNodes[i].expandAll(); +} } + +WebFXTreeAbstractNode.prototype.collapseAll = function() { + if ((this.folder) && (this.open)) { this.collapse(); } + this.collapseChildren(); +} + +WebFXTreeAbstractNode.prototype.collapseChildren = function() { + for (var i = 0; i < this.childNodes.length; i++) { + this.childNodes[i].collapseAll(); +} } + +WebFXTreeAbstractNode.prototype.indent = function(lvl, del, last, level) { + /* + * Since we only want to modify items one level below ourself, + * and since the rightmost indentation position is occupied by + * the plus icon we set this to -2 + */ + if (lvl == null) { lvl = -2; } + var state = 0; + for (var i = this.childNodes.length - 1; i >= 0 ; i--) { + state = this.childNodes[i].indent(lvl + 1, del, last, level); + if (state) { return; } + } + if (del) { + if (level >= this._level) { + if (this.folder) { + document.getElementById(this.id + '-plus').src = (this.open)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.lPlusIcon; + this.plusIcon = webFXTreeConfig.lPlusIcon; + this.minusIcon = webFXTreeConfig.lMinusIcon; + } + else { document.getElementById(this.id + '-plus').src = webFXTreeConfig.lIcon; } + return 1; + } + } + var foo = document.getElementById(this.id + '-indent-' + lvl); + if (foo) { + if ((del) && (last)) { foo._last = true; } + if (foo._last) { foo.src = webFXTreeConfig.blankIcon; } + else { foo.src = webFXTreeConfig.iIcon; } + } + return 0; +} + +/* + * WebFXTree class + */ + +function WebFXTree(sText, sAction, sBehavior, sIcon, sOpenIcon) { + this.base = WebFXTreeAbstractNode; + this.base(sText, sAction); + this.icon = sIcon || webFXTreeConfig.rootIcon; + this.openIcon = sOpenIcon || webFXTreeConfig.openRootIcon; + /* Defaults to open */ + this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '0')?false:true; + this.folder = true; + this.rendered = false; + if (!webFXTreeHandler.behavior) { webFXTreeHandler.behavior = sBehavior || webFXTreeConfig.defaultBehavior; } + this.targetWindow = 'right'; +} + +WebFXTree.prototype = new WebFXTreeAbstractNode; + +WebFXTree.prototype.setBehavior = function (sBehavior) { + webFXTreeHandler.behavior = sBehavior; +}; + +WebFXTree.prototype.getBehavior = function (sBehavior) { + return webFXTreeHandler.behavior; +}; + +WebFXTree.prototype.getSelected = function() { + if (webFXTreeHandler.selected) { return webFXTreeHandler.selected; } + else { return null; } +} + +WebFXTree.prototype.remove = function() { } + +WebFXTree.prototype.expand = function() { + this.doExpand(); +} + +WebFXTree.prototype.collapse = function() { + this.focus(); + this.doCollapse(); +} + +WebFXTree.prototype.getFirst = function() { + return null; +} + +WebFXTree.prototype.getLast = function() { + return null; +} + +WebFXTree.prototype.getNextSibling = function() { + return null; +} + +WebFXTree.prototype.getPreviousSibling = function() { + return null; +} + +WebFXTree.prototype.keydown = function(key) { + if (key == 39) { this.expand(); return false; } + if (key == 37) { this.collapse(); return false; } + if ((key == 40) && (this.open)) { this.childNodes[0].select(); return false; } + return true; +} + +WebFXTree.prototype.toString = function() { + var str = "
"; + str += "" + this.text + "
"; + str += "
"; + for (var i = 0; i < this.childNodes.length; i++) { + str += this.childNodes[i].toString(i, this.childNodes.length); + } + str += "
"; + this.rendered = true; + return str; +}; + +/* + * WebFXTreeItem class + */ + +function WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon) { + this.base = WebFXTreeAbstractNode; + this.base(sText, sAction); + /* Defaults to close */ + this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '1')?true:false; + if (eParent) { eParent.add(this); } + if (sIcon) { this.icon = sIcon; } + if (sOpenIcon) { this.openIcon = sOpenIcon; } +} + +WebFXTreeItem.prototype = new WebFXTreeAbstractNode; + +WebFXTreeItem.prototype.remove = function() { + var parentNode = this.parentNode; + var prevSibling = this.getPreviousSibling(true); + var nextSibling = this.getNextSibling(true); + var folder = this.parentNode.folder; + var last = ((nextSibling) && (nextSibling.parentNode) && (nextSibling.parentNode.id == parentNode.id))?false:true; + this.getPreviousSibling().focus(); + this._remove(); + if (parentNode.childNodes.length == 0) { + parentNode.folder = false; + parentNode.open = false; + } + if (last) { + if (parentNode.id == prevSibling.id) { + document.getElementById(parentNode.id + '-icon').src = webFXTreeConfig.fileIcon; + } + else { } + } + if ((!prevSibling.parentNode) || (prevSibling.parentNode != parentNode)) { + parentNode.indent(null, true, last, this._level); + } + if (document.getElementById(prevSibling.id + '-plus')) { + if (nextSibling) { + if ((parentNode == prevSibling) && (parentNode.getNextSibling)) { document.getElementById(prevSibling.id + '-plus').src = webFXTreeConfig.tIcon; } + else if (nextSibling.parentNode != prevSibling) { document.getElementById(prevSibling.id + '-plus').src = webFXTreeConfig.lIcon; } + } + else { document.getElementById(prevSibling.id + '-plus').src = webFXTreeConfig.lIcon; } + } +} + +WebFXTreeItem.prototype._remove = function() { + for (var i = this.childNodes.length - 1; i >= 0; i--) { + this.childNodes[i]._remove(); + } + for (var i = 0; i < this.parentNode.childNodes.length; i++) { + if (this.id == this.parentNode.childNodes[i].id) { + for (var j = i; j < this.parentNode.childNodes.length; j++) { + this.parentNode.childNodes[i] = this.parentNode.childNodes[i+1] + } + this.parentNode.childNodes.length = this.parentNode.childNodes.length - 1; + if (i + 1 == this.parentNode.childNodes.length) { this.parentNode._last = true; } + } + } + webFXTreeHandler.all[this.id] = null; + if (document.getElementById(this.id)) { + document.getElementById(this.id).innerHTML = ""; + document.getElementById(this.id).removeNode(); + } +} + +WebFXTreeItem.prototype.expand = function() { + this.doExpand(); + document.getElementById(this.id + '-plus').src = this.minusIcon; +} + +WebFXTreeItem.prototype.collapse = function() { + this.focus(); + this.doCollapse(); + document.getElementById(this.id + '-plus').src = this.plusIcon; +} + +WebFXTreeItem.prototype.getFirst = function() { + return this.childNodes[0]; +} + +WebFXTreeItem.prototype.getLast = function() { + if (this.childNodes[this.childNodes.length - 1].open) { return this.childNodes[this.childNodes.length - 1].getLast(); } + else { return this.childNodes[this.childNodes.length - 1]; } +} + +WebFXTreeItem.prototype.getNextSibling = function() { + for (var i = 0; i < this.parentNode.childNodes.length; i++) { + if (this == this.parentNode.childNodes[i]) { break; } + } + if (++i == this.parentNode.childNodes.length) { return this.parentNode.getNextSibling(); } + else { return this.parentNode.childNodes[i]; } +} + +WebFXTreeItem.prototype.getPreviousSibling = function(b) { + for (var i = 0; i < this.parentNode.childNodes.length; i++) { + if (this == this.parentNode.childNodes[i]) { break; } + } + if (i == 0) { return this.parentNode; } + else { + if ((this.parentNode.childNodes[--i].open) || (b && this.parentNode.childNodes[i].folder)) { return this.parentNode.childNodes[i].getLast(); } + else { return this.parentNode.childNodes[i]; } +} } + +WebFXTreeItem.prototype.keydown = function(key) { + if ((key == 39) && (this.folder)) { + if (!this.open) { this.expand(); return false; } + else { this.getFirst().select(); return false; } + } + else if (key == 37) { + if (this.open) { this.collapse(); return false; } + else { this.parentNode.select(); return false; } + } + else if (key == 40) { + if (this.open) { this.getFirst().select(); return false; } + else { + var sib = this.getNextSibling(); + if (sib) { sib.select(); return false; } + } } + else if (key == 38) { this.getPreviousSibling().select(); return false; } + return true; +} + +WebFXTreeItem.prototype.toString = function (nItem, nItemCount) { + var foo = this.parentNode; + var indent = ''; + if (nItem + 1 == nItemCount) { this.parentNode._last = true; } + var i = 0; + while (foo.parentNode) { + foo = foo.parentNode; + indent = "" + indent; + i++; + } + this._level = i; + if (this.childNodes.length) { this.folder = 1; } + else { this.open = false; } + if ((this.folder) || (webFXTreeHandler.behavior != 'classic')) { + if (!this.icon) { this.icon = webFXTreeConfig.folderIcon; } + if (!this.openIcon) { this.openIcon = webFXTreeConfig.openFolderIcon; } + } + else if (!this.icon) { this.icon = webFXTreeConfig.fileIcon; } + var label = this.text; + label = label.replace('<', '<'); + label = label.replace('>', '>'); + var str = "
"; + str += indent; + str += "" + str += "" + label + "
"; + str += "
"; + for (var i = 0; i < this.childNodes.length; i++) { + str += this.childNodes[i].toString(i,this.childNodes.length); + } + str += "
"; + this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon); + this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon); + return str; +} diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/stylesheet.css b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/stylesheet.css old mode 100755 new mode 100644 index 498826ae1..df89aff5a --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/media/stylesheet.css +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/media/stylesheet.css @@ -1,181 +1,181 @@ -a { color: #000090; text-decoration: none; } -a:hover, a:active, a:focus { color: highlighttext; background-color: highlight; text-decoration: none; } - -body { background : #FFFFFF; } -body, table { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } - -a img { border: 0px; } - -/* Page layout/boxes */ - -.info-box { } -.info-box-title { margin: 1em 0em 0em 0em; font-weight: normal; font-size: 14pt; color: #999999; border-bottom: 2px solid #999999; } -.info-box-body { border: 1px solid #999999; padding: .5em; } -.nav-bar { font-size: 8pt; white-space: nowrap; text-align: right; padding: .2em; margin: 0em 0em 1em 0em; } - -.oddrow { background-color: #F8F8F8; border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} -.evenrow { border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} - -.page-body { max-width: 800px; margin: auto; } -.tree { } - -/* Index formatting classes */ - -.index-item-body { margin-top: .5em; margin-bottom: .5em} -.index-item-description { margin-top: .25em } -.index-item-details { font-weight: normal; font-style: italic; font-size: 8pt } -.index-letter-section { background-color: #EEEEEE; border: 1px dotted #999999; padding: .5em; margin-bottom: 1em} -.index-letter-title { font-size: 12pt; font-weight: bold } -.index-letter-menu { text-align: center; margin: 1em } -.index-letter { font-size: 12pt } - -/* Docbook classes */ - -.description {} -.short-description { font-weight: bold; color: #666666; } -.tags { padding-left: 0em; margin-left: 3em; color: #666666; list-style-type: square; } -.parameters { padding-left: 0em; margin-left: 3em; color: #014fbe; list-style-type: square; } -.redefinitions { font-size: 8pt; padding-left: 0em; margin-left: 2em; } -.package { font-weight: bold; } -.package-title { font-weight: bold; font-size: 14pt; border-bottom: 1px solid black } -.sub-package { font-weight: bold; } -.tutorial { border-width: thin; border-color: #0066ff; } -.tutorial-nav-box { width: 100%; border: 1px solid #999999; background-color: #F8F8F8; } - -/* Generic formatting */ - -.field { font-weight: bold; } -.detail { font-size: 8pt; } -.notes { font-style: italic; font-size: 8pt; } -.separator { background-color: #999999; height: 2px; } -.warning { color: #FF6600; } -.disabled { font-style: italic; color: #999999; } - -/* Code elements */ - -.line-number { } - -.class-table { width: 100%; } -.class-table-header { border-bottom: 1px dotted #666666; text-align: left} -.class-name { color: #0000AA; font-weight: bold; } - -.method-summary { color: #009000; padding-left: 1em; font-size: 8pt; } -.method-header { } -.method-definition { margin-bottom: .2em } -.method-title { color: #009000; font-weight: bold; } -.method-name { font-weight: bold; } -.method-signature { font-size: 85%; color: #666666; margin: .5em 0em } -.method-result { font-style: italic; } - -.var-summary { padding-left: 1em; font-size: 8pt; } -.var-header { } -.var-title { color: #014fbe; margin-bottom: .3em } -.var-type { font-style: italic; } -.var-name { font-weight: bold; } -.var-default {} -.var-description { font-weight: normal; color: #000000; } - -.include-title { color: #014fbe;} -.include-type { font-style: italic; } -.include-name { font-weight: bold; } - -.const-title { color: #FF6600; } -.const-name { font-weight: bold; } - -/* Syntax highlighting */ - -.src-code { font-family: 'Courier New', Courier, monospace; font-weight: normal; } -.src-line { font-family: 'Courier New', Courier, monospace; font-weight: normal; } - -.src-code a:link { padding: 1px; text-decoration: underline; color: #0000DD; } -.src-code a:visited { text-decoration: underline; color: #0000DD; } -.src-code a:active { background-color: #FFFF66; color: #008000; } -.src-code a:hover { background-color: #FFFF66; text-decoration: overline underline; color: #008000; } - -.src-comm { color: #666666; } -.src-id { color: #FF6600; font-style: italic; } -.src-inc { color: #0000AA; font-weight: bold; } -.src-key { color: #0000AA; font-weight: bold; } -.src-num { color: #CC0000; } -.src-str { color: #CC0000; } -.src-sym { } -.src-var { } - -.src-php { font-weight: bold; } - -.src-doc { color: #666666; } -.src-doc-close-template { color: #666666 } -.src-doc-coretag { color: #008000; } -.src-doc-inlinetag {} -.src-doc-internal {} -.src-doc-tag { color: #0080CC; } -.src-doc-template { color: #666666 } -.src-doc-type { font-style: italic; color: #444444 } -.src-doc-var { color: #444444 } - -.tute-tag { color: #009999 } -.tute-attribute-name { color: #0000FF } -.tute-attribute-value { color: #0099FF } -.tute-entity { font-weight: bold; } -.tute-comment { font-style: italic } -.tute-inline-tag { color: #636311; font-weight: bold } - -/* tutorial */ - -.authors { } -.author { font-style: italic; font-weight: bold } -.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal } -.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; } -.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; } -.release-info { font-size: 85%; font-style: italic; margin: 1em 0em } -.ref-title-box { } -.ref-title { } -.ref-purpose { font-style: italic; color: #666666 } -.ref-synopsis { } -.title { font-weight: bold; border-bottom: 1px solid #999999; color: #999999; } -.cmd-synopsis { margin: 1em 0em } -.cmd-title { font-weight: bold } -.toc { margin-left: 2em; padding-left: 0em } - -/*------------------------------------------------------------------------------ - webfx-tree -------------------------------------------------------------------------------*/ - -.webfx-tree-container { - margin: 0px; - padding: 0px; - white-space: nowrap; - font: icon; -} - -.webfx-tree-item { - padding: 0px; - margin: 0px; - color: black; - white-space: nowrap; - font: icon; -} - -.webfx-tree-item a { - margin-left: 3px; - padding: 1px 2px 1px 2px; - color: black; - text-decoration: none; -} - -.webfx-tree-item a:hover, .webfx-tree-item a:active { - color: highlighttext; - background: highlight; - text-decoration: none -} - -.webfx-tree-item img { - vertical-align: middle; - border: 0px; -} - -.webfx-tree-icon { - width: 16px; - height: 16px; -} - +a { color: #000090; text-decoration: none; } +a:hover, a:active, a:focus { color: highlighttext; background-color: highlight; text-decoration: none; } + +body { background : #FFFFFF; } +body, table { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } + +a img { border: 0px; } + +/* Page layout/boxes */ + +.info-box { } +.info-box-title { margin: 1em 0em 0em 0em; font-weight: normal; font-size: 14pt; color: #999999; border-bottom: 2px solid #999999; } +.info-box-body { border: 1px solid #999999; padding: .5em; } +.nav-bar { font-size: 8pt; white-space: nowrap; text-align: right; padding: .2em; margin: 0em 0em 1em 0em; } + +.oddrow { background-color: #F8F8F8; border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} +.evenrow { border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} + +.page-body { max-width: 800px; margin: auto; } +.tree { } + +/* Index formatting classes */ + +.index-item-body { margin-top: .5em; margin-bottom: .5em} +.index-item-description { margin-top: .25em } +.index-item-details { font-weight: normal; font-style: italic; font-size: 8pt } +.index-letter-section { background-color: #EEEEEE; border: 1px dotted #999999; padding: .5em; margin-bottom: 1em} +.index-letter-title { font-size: 12pt; font-weight: bold } +.index-letter-menu { text-align: center; margin: 1em } +.index-letter { font-size: 12pt } + +/* Docbook classes */ + +.description {} +.short-description { font-weight: bold; color: #666666; } +.tags { padding-left: 0em; margin-left: 3em; color: #666666; list-style-type: square; } +.parameters { padding-left: 0em; margin-left: 3em; color: #014fbe; list-style-type: square; } +.redefinitions { font-size: 8pt; padding-left: 0em; margin-left: 2em; } +.package { font-weight: bold; } +.package-title { font-weight: bold; font-size: 14pt; border-bottom: 1px solid black } +.sub-package { font-weight: bold; } +.tutorial { border-width: thin; border-color: #0066ff; } +.tutorial-nav-box { width: 100%; border: 1px solid #999999; background-color: #F8F8F8; } + +/* Generic formatting */ + +.field { font-weight: bold; } +.detail { font-size: 8pt; } +.notes { font-style: italic; font-size: 8pt; } +.separator { background-color: #999999; height: 2px; } +.warning { color: #FF6600; } +.disabled { font-style: italic; color: #999999; } + +/* Code elements */ + +.line-number { } + +.class-table { width: 100%; } +.class-table-header { border-bottom: 1px dotted #666666; text-align: left} +.class-name { color: #0000AA; font-weight: bold; } + +.method-summary { color: #009000; padding-left: 1em; font-size: 8pt; } +.method-header { } +.method-definition { margin-bottom: .2em } +.method-title { color: #009000; font-weight: bold; } +.method-name { font-weight: bold; } +.method-signature { font-size: 85%; color: #666666; margin: .5em 0em } +.method-result { font-style: italic; } + +.var-summary { padding-left: 1em; font-size: 8pt; } +.var-header { } +.var-title { color: #014fbe; margin-bottom: .3em } +.var-type { font-style: italic; } +.var-name { font-weight: bold; } +.var-default {} +.var-description { font-weight: normal; color: #000000; } + +.include-title { color: #014fbe;} +.include-type { font-style: italic; } +.include-name { font-weight: bold; } + +.const-title { color: #FF6600; } +.const-name { font-weight: bold; } + +/* Syntax highlighting */ + +.src-code { font-family: 'Courier New', Courier, monospace; font-weight: normal; } +.src-line { font-family: 'Courier New', Courier, monospace; font-weight: normal; } + +.src-code a:link { padding: 1px; text-decoration: underline; color: #0000DD; } +.src-code a:visited { text-decoration: underline; color: #0000DD; } +.src-code a:active { background-color: #FFFF66; color: #008000; } +.src-code a:hover { background-color: #FFFF66; text-decoration: overline underline; color: #008000; } + +.src-comm { color: #666666; } +.src-id { color: #FF6600; font-style: italic; } +.src-inc { color: #0000AA; font-weight: bold; } +.src-key { color: #0000AA; font-weight: bold; } +.src-num { color: #CC0000; } +.src-str { color: #CC0000; } +.src-sym { } +.src-var { } + +.src-php { font-weight: bold; } + +.src-doc { color: #666666; } +.src-doc-close-template { color: #666666 } +.src-doc-coretag { color: #008000; } +.src-doc-inlinetag {} +.src-doc-internal {} +.src-doc-tag { color: #0080CC; } +.src-doc-template { color: #666666 } +.src-doc-type { font-style: italic; color: #444444 } +.src-doc-var { color: #444444 } + +.tute-tag { color: #009999 } +.tute-attribute-name { color: #0000FF } +.tute-attribute-value { color: #0099FF } +.tute-entity { font-weight: bold; } +.tute-comment { font-style: italic } +.tute-inline-tag { color: #636311; font-weight: bold } + +/* tutorial */ + +.authors { } +.author { font-style: italic; font-weight: bold } +.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal } +.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; } +.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; } +.release-info { font-size: 85%; font-style: italic; margin: 1em 0em } +.ref-title-box { } +.ref-title { } +.ref-purpose { font-style: italic; color: #666666 } +.ref-synopsis { } +.title { font-weight: bold; border-bottom: 1px solid #999999; color: #999999; } +.cmd-synopsis { margin: 1em 0em } +.cmd-title { font-weight: bold } +.toc { margin-left: 2em; padding-left: 0em } + +/*------------------------------------------------------------------------------ + webfx-tree +------------------------------------------------------------------------------*/ + +.webfx-tree-container { + margin: 0px; + padding: 0px; + white-space: nowrap; + font: icon; +} + +.webfx-tree-item { + padding: 0px; + margin: 0px; + color: black; + white-space: nowrap; + font: icon; +} + +.webfx-tree-item a { + margin-left: 3px; + padding: 1px 2px 1px 2px; + color: black; + text-decoration: none; +} + +.webfx-tree-item a:hover, .webfx-tree-item a:active { + color: highlighttext; + background: highlight; + text-decoration: none +} + +.webfx-tree-item img { + vertical-align: middle; + border: 0px; +} + +.webfx-tree-icon { + width: 16px; + height: 16px; +} + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/packages.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/packages.html old mode 100755 new mode 100644 index a4852e3d0..c1ec01543 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/packages.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/packages.html @@ -1,40 +1,40 @@ - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_INSTALL.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_INSTALL.html old mode 100755 new mode 100644 index 8851703f1..1b6e70b85 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_INSTALL.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_INSTALL.html @@ -1,49 +1,50 @@ - - - - - - - - - -

INSTALL

-
-------------------------------------------------------------------------------
-
-                     SETUP: How to install Krumo ?
-
-------------------------------------------------------------------------------
-
-In order to use Krumo you have to put it on your (development) server, and 
-include it in your script. You can put it somewhere in the INCLUDE_PATH, or 
-specify the full path to the "class.krumo.php" file.
-
-You have to modify the "krumo.ini" file too. It is the configuration file for 
-Krumo. The first option is choosing a skin:
-
- [skin]
- selected = "orange"
-
-The value for this setting has to be the name of one of the sub-folders from the 
-"Krumo/skins/" folder. If the value provided for the skin results in not finding 
-the skin, the `default` skin will be used instead.
-
-The second option is used to set the correct web path to the folder where Krumo 
-is installed. This is used in order to make the images from Krumo's CSS skins 
-web-accessible.
-
- [css]
- url = "http://www.example.com/Krumo/"
-
-So far those two are the only configuration options.
-
-All the CSS files ("skin.css") from the "Krumo/skins/" sub-folders must have the 
-proper permissions in order to be readable from Krumo. Same applies for 
-"krumo.ini" and "krumo.js" files.
-
-

- Documentation generated on Sun, 02 Dec 2007 09:43:22 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + + + + + +

INSTALL

+
+------------------------------------------------------------------------------
+
+                     SETUP: How to install Krumo ?
+
+------------------------------------------------------------------------------
+
+In order to use Krumo you have to put it on your (development) server, and
+include it in your script. You can put it somewhere in the INCLUDE_PATH, or
+specify the full path to the "class.krumo.php" file.
+
+You have to modify the "krumo.ini" file too. It is the configuration file for
+Krumo. The first option is choosing a skin:
+
+ [skin]
+ selected = "orange"
+
+The value for this setting has to be the name of one of the sub-folders from the
+"Krumo/skins/" folder. If the value provided for the skin results in not finding
+the skin, the `default` skin will be used instead.
+
+The second option is used to set the correct web path to the folder where Krumo
+is installed. This is used in order to make the images from Krumo's CSS skins
+web-accessible.
+
+ [css]
+ url = "http://www.example.com/Krumo/"
+
+So far those two are the only configuration options.
+
+All the CSS files ("skin.css") from the "Krumo/skins/" sub-folders must have the
+proper permissions in order to be readable from Krumo. Same applies for
+"krumo.ini" and "krumo.js" files.
+
+

+ Documentation generated on Sun, 02 Dec 2007 09:43:22 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_LICENSE.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_LICENSE.html old mode 100755 new mode 100644 index aa2cad1e9..ec72a254a --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_LICENSE.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_LICENSE.html @@ -1,522 +1,523 @@ - - - - - - - - - -

LICENSE

-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
-
-
-

- Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + + + + + +

LICENSE

+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+
+

+ Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_README.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_README.html old mode 100755 new mode 100644 index 02a45c8f3..49f526293 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_README.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_README.html @@ -1,121 +1,122 @@ - - - - - - - - - -

README

-
-=============================================================================
-
-                               Krumo
-                            version 0.2.1a
-
-=============================================================================
-
-You probably got this package from...
-http://www.sourceforge.net/projects/krumo/
-
-If there is no licence agreement with this package please download
-a version from the location above. You must read and accept that
-licence to use this software. The file is titled simply LICENSE.
-
-OVERVIEW
-------------------------------------------------------------------------------
-To put it simply, Krumo is a replacement for print_r() and var_dump(). By 
-definition Krumo is a debugging tool (for PHP5), which displays structured 
-information about any PHP variable.
-
-A lot of developers use print_r() and var_dump() in the means of debugging 
-tools. Although they were intended to present human readble information about a 
-variable, we can all agree that in general they are not. Krumo is an 
-alternative: it does the same job, but it presents the information beautified 
-using CSS and DHTML. 
-
-EXAMPLES
-------------------------------------------------------------------------------
-Here's a basic example, which will return a report on the array variable passed 
-as argument to it:
-
- krumo(array('a1'=> 'A1', 3, 'red'));
-
-You can dump simultaneously more then one variable - here's another example:
-
- krumo($_SERVER, $_REQUEST);
-
-You probably saw from the examples above that some of the nodes are expandable, 
-so if you want to inspect the nested information, click on them and they will 
-expand; if you do not need that information shown simply click again on it to 
-collapse it. Here's an example to test this:
-
- $x1->x2->x3->x4->x5->x6->x7->x8->x9 = 'X10';
- krumo($x1);
-
-The krumo() is the only standalone function from the package, and this is 
-because basic dumps about variables (like print_r() or var_dump()) are the most 
-common tasks such functionality is used for. The rest of the functionality can 
-be called using static calls to the Krumo class. Here are several more examples:
-
- // print a debug backgrace
- krumo::backtrace();
-
- // print all the included(or required) files
- krumo::includes();
- 
- // print all the included functions
- krumo::functions();
- 
- // print all the declared classes
- krumo::classes();
- 
- // print all the defined constants
- krumo::defines();
-
- ... and so on, etc.
-
-A full PHPDocumenter API documentation exists both in this package and at the 
-project's website.
-
-INSTALL
-------------------------------------------------------------------------------
-Read the INSTALL file.
-
-DOCUMENTATION
-------------------------------------------------------------------------------
-As I said, a full PHPDocumenter API documentation can be found both in this
-package and at the project's website.
-
-SKINS
-------------------------------------------------------------------------------
-There are several skins pre-installed with this package, but if you wish you can 
-create skins of your own. The skins are simply CSS files that are prepended to 
-the result that Krumo prints. If you want to use images in your CSS (for 
-background, list-style, etc), you have to put "%URL%" in front of the image URL 
-in order hook it up to the skin folder and make the image web-accessible.
-
-Here's an example:
-
- ul.krumo-first {background: url(%url%bg.gif);}
-
-TODO
-------------------------------------------------------------------------------
-You can find the list of stuff that is going to be added to this project in the 
-TODO file from this very package.
-
-CONTRIBUTION
------------------------------------------------------------------------------
-If you download and use and possibly even extend this tool, please let us know. 
-Any feedback, even bad, is always welcome and your suggestions are going to be 
-considered for our next release. Please use our SourceForge page for that:
- 
- http://www.sourceforge.net/projects/krumo/
-
-
-

- Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + + + + + +

README

+
+=============================================================================
+
+                               Krumo
+                            version 0.2.1a
+
+=============================================================================
+
+You probably got this package from...
+http://www.sourceforge.net/projects/krumo/
+
+If there is no licence agreement with this package please download
+a version from the location above. You must read and accept that
+licence to use this software. The file is titled simply LICENSE.
+
+OVERVIEW
+------------------------------------------------------------------------------
+To put it simply, Krumo is a replacement for print_r() and var_dump(). By
+definition Krumo is a debugging tool (for PHP5), which displays structured
+information about any PHP variable.
+
+A lot of developers use print_r() and var_dump() in the means of debugging
+tools. Although they were intended to present human readble information about a
+variable, we can all agree that in general they are not. Krumo is an
+alternative: it does the same job, but it presents the information beautified
+using CSS and DHTML.
+
+EXAMPLES
+------------------------------------------------------------------------------
+Here's a basic example, which will return a report on the array variable passed
+as argument to it:
+
+ krumo(array('a1'=> 'A1', 3, 'red'));
+
+You can dump simultaneously more then one variable - here's another example:
+
+ krumo($_SERVER, $_REQUEST);
+
+You probably saw from the examples above that some of the nodes are expandable,
+so if you want to inspect the nested information, click on them and they will
+expand; if you do not need that information shown simply click again on it to
+collapse it. Here's an example to test this:
+
+ $x1->x2->x3->x4->x5->x6->x7->x8->x9 = 'X10';
+ krumo($x1);
+
+The krumo() is the only standalone function from the package, and this is
+because basic dumps about variables (like print_r() or var_dump()) are the most
+common tasks such functionality is used for. The rest of the functionality can
+be called using static calls to the Krumo class. Here are several more examples:
+
+ // print a debug backgrace
+ krumo::backtrace();
+
+ // print all the included(or required) files
+ krumo::includes();
+
+ // print all the included functions
+ krumo::functions();
+
+ // print all the declared classes
+ krumo::classes();
+
+ // print all the defined constants
+ krumo::defines();
+
+ ... and so on, etc.
+
+A full PHPDocumenter API documentation exists both in this package and at the
+project's website.
+
+INSTALL
+------------------------------------------------------------------------------
+Read the INSTALL file.
+
+DOCUMENTATION
+------------------------------------------------------------------------------
+As I said, a full PHPDocumenter API documentation can be found both in this
+package and at the project's website.
+
+SKINS
+------------------------------------------------------------------------------
+There are several skins pre-installed with this package, but if you wish you can
+create skins of your own. The skins are simply CSS files that are prepended to
+the result that Krumo prints. If you want to use images in your CSS (for
+background, list-style, etc), you have to put "%URL%" in front of the image URL
+in order hook it up to the skin folder and make the image web-accessible.
+
+Here's an example:
+
+ ul.krumo-first {background: url(%url%bg.gif);}
+
+TODO
+------------------------------------------------------------------------------
+You can find the list of stuff that is going to be added to this project in the
+TODO file from this very package.
+
+CONTRIBUTION
+-----------------------------------------------------------------------------
+If you download and use and possibly even extend this tool, please let us know.
+Any feedback, even bad, is always welcome and your suggestions are going to be
+considered for our next release. Please use our SourceForge page for that:
+
+ http://www.sourceforge.net/projects/krumo/
+
+
+

+ Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_TODO.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_TODO.html old mode 100755 new mode 100644 index 82b751e8b..b0eba4d5e --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_TODO.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_TODO.html @@ -1,41 +1,42 @@ - - - - - - - - - -

TODO

-
-******************************************************************************
-
-                                 Krumo: TODO
-
-******************************************************************************
-
-BUGS
-----------------
- - watch the SourceForge.net Bug Tracker
-
-Features: PHP
-----------------
- - Try to detect anonymous (lambda) functions
- - Try to detect whether an array is indexed or associated
- - Add var_export support for arrays and objects
- - Add JSON support for arrays and objects
- 
-Features: GUI
-----------------
- - Nicer and friendlier skin(s)
- - Add top-level links for collapsing and expanding the whole tree
- - Add object & array -level links for collapsing and expanding all the
- 	nested nodes
- - Print all parent classes for the rendered objects
-
-

- Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + + + + + +

TODO

+
+******************************************************************************
+
+                                 Krumo: TODO
+
+******************************************************************************
+
+BUGS
+----------------
+ - watch the SourceForge.net Bug Tracker
+
+Features: PHP
+----------------
+ - Try to detect anonymous (lambda) functions
+ - Try to detect whether an array is indexed or associated
+ - Add var_export support for arrays and objects
+ - Add JSON support for arrays and objects
+
+Features: GUI
+----------------
+ - Nicer and friendlier skin(s)
+ - Add top-level links for collapsing and expanding the whole tree
+ - Add object & array -level links for collapsing and expanding all the
+   nested nodes
+ - Print all parent classes for the rendered objects
+
+

+ Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_VERSION.html b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_VERSION.html old mode 100755 new mode 100644 index 45904040e..f929fc826 --- a/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_VERSION.html +++ b/docroot/sites/all/modules/contrib/devel/krumo/docs/ric_VERSION.html @@ -1,18 +1,19 @@ - - - - - - - - - -

VERSION

-
-0.2.1a
-
-

- Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 -

- - \ No newline at end of file + + + + + + + + + + +

VERSION

+
+0.2.1a
+
+

+ Documentation generated on Sun, 02 Dec 2007 09:43:23 +0200 by phpDocumentor 1.4.0a2 +

+ + diff --git a/docroot/sites/all/modules/contrib/devel/krumo/krumo.ini b/docroot/sites/all/modules/contrib/devel/krumo/krumo.ini old mode 100755 new mode 100644 index 3e20dd91d..8946ec06e --- a/docroot/sites/all/modules/contrib/devel/krumo/krumo.ini +++ b/docroot/sites/all/modules/contrib/devel/krumo/krumo.ini @@ -1,20 +1,20 @@ -; -; KRUMO CONFIGURATION FILE -; - -[skin] -selected = "white" -; -; Change the above value to set the CSS skin used to render -; Krumo layout. If the skin is not found, then the "default" one -; is going to be used. -; - -[css] -url = "http://www.example.com/Krumo/" -; -; This value is used to set the URL path to -; where the Krumo folder is. This is required in -; order to have web access to Krumo's CSS and -; image files. -; +; +; KRUMO CONFIGURATION FILE +; + +[skin] +selected = "white" +; +; Change the above value to set the CSS skin used to render +; Krumo layout. If the skin is not found, then the "default" one +; is going to be used. +; + +[css] +url = "http://www.example.com/Krumo/" +; +; This value is used to set the URL path to +; where the Krumo folder is. This is required in +; order to have web access to Krumo's CSS and +; image files. +; diff --git a/docroot/sites/all/modules/contrib/devel/krumo/krumo.js b/docroot/sites/all/modules/contrib/devel/krumo/krumo.js old mode 100755 new mode 100644 index 240af8cb4..10631ee01 --- a/docroot/sites/all/modules/contrib/devel/krumo/krumo.js +++ b/docroot/sites/all/modules/contrib/devel/krumo/krumo.js @@ -1,97 +1,97 @@ -/** -* JavaScript routines for Krumo -* -* @link http://sourceforge.net/projects/krumo -*/ - -///////////////////////////////////////////////////////////////////////////// - -/** -* Krumo JS Class -*/ -function krumo() { - } - -// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -/** -* Add a CSS class to an HTML element -* -* @param HtmlElement el -* @param string className -* @return void -*/ -krumo.reclass = function(el, className) { - if (el.className.indexOf(className) < 0) { - el.className += (' ' + className); - } - } - -// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -/** -* Remove a CSS class to an HTML element -* -* @param HtmlElement el -* @param string className -* @return void -*/ -krumo.unclass = function(el, className) { - if (el.className.indexOf(className) > -1) { - el.className = el.className.replace(className, ''); - } - } - -// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -/** -* Toggle the nodes connected to an HTML element -* -* @param HtmlElement el -* @return void -*/ -krumo.toggle = function(el) { - var ul = el.parentNode.getElementsByTagName('ul'); - for (var i=0; i -1) { + el.className = el.className.replace(className, ''); + } + } + +// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +/** +* Toggle the nodes connected to an HTML element +* +* @param HtmlElement el +* @return void +*/ +krumo.toggle = function(el) { + var ul = el.parentNode.getElementsByTagName('ul'); + for (var i=0; i -*/ - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -ul.krumo-node { - margin: 0px; - padding: 0px; - } -ul.krumo-node ul { - margin-left: 20px; - } -* html ul.krumo-node ul { - margin-left: 24px; - } -div.krumo-root { - border: solid 1px black; - margin: 1em 0em; - } -ul.krumo-first { - font: normal 12px arial; - border: solid 2px white; - border-top-width:1px; - background: url(%url%bg.gif); - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-child { - display:block; - list-style: none; - padding: 0px; - margin: 0px; - overflow:hidden; - } -div.krumo-element { - cursor:default; - - line-height: 24px; - display:block; - - clear:both; - white-space:nowrap; - - border-top: solid 1px white; - background: #BFDFFF; - padding-left: 10px; - } -* html div.krumo-element { - padding-bottom: 3px; - } -a.krumo-name { - color:navy; - font: bold 13px Arial; - } -a.krumo-name big { - font: bold 20pt Georgia; - line-height: 14px; - position:relative; - top:2px; - left:-2px; - } -* html a.krumo-name big { - font: bold 19pt Georgia; - top: 5px; - left: 0px; - line-height: 9px; - height: 12px; - padding: 0px; - margin: 0px; - } -div.krumo-expand { - background: #AAD5FF; - cursor:pointer; - } -div.krumo-hover { - background: #FFBE7D; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-preview { - font: normal 13px courier new; - padding: 5px 5px 14px 5px; - background: white; - border-top: 0px; - overflow:auto; - white-space: pre; - } -* html div.krumo-preview { - padding-top: 2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-footnote { - background:white; - padding: 2px 5px; - list-style:none; - border-top: solid 1px #bebebe; - margin-top:2px; - cursor:default; - } -* html li.krumo-footnote { - line-height: 13px; - } -div.krumo-version { - float:right; - } -li.krumo-footnote h6 { - font: bold 11px verdana; - margin: 0px; - padding: 0px; - color:navy; - display:inline; - } -* html li.krumo-footnote h6 { - margin-right: 3px; - } -li.krumo-footnote a { - font: bold 10px arial; - color: #434343; - text-decoration:none; - } -li.krumo-footnote a:hover { - color:black; - } - -li.krumo-footnote span.krumo-call { - font:normal 11px verdana; - position: relative; - top: 1px; - } -li.krumo-footnote span.krumo-call code { - font-weight:bold; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-title { - font: normal 11px verdana ; - position:relative; - top:9px; - cursor:default; - line-height:2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -strong.krumo-array-length, -strong.krumo-string-length { - font-weight: normal; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ +/** +* Krumo "Blue" Skin +* +* @author Kaloyan K. Tsvetkov +*/ + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +ul.krumo-node { + margin: 0px; + padding: 0px; + } +ul.krumo-node ul { + margin-left: 20px; + } +* html ul.krumo-node ul { + margin-left: 24px; + } +div.krumo-root { + border: solid 1px black; + margin: 1em 0em; + } +ul.krumo-first { + font: normal 12px arial; + border: solid 2px white; + border-top-width:1px; + background: url(%url%bg.gif); + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-child { + display:block; + list-style: none; + padding: 0px; + margin: 0px; + overflow:hidden; + } +div.krumo-element { + cursor:default; + + line-height: 24px; + display:block; + + clear:both; + white-space:nowrap; + + border-top: solid 1px white; + background: #BFDFFF; + padding-left: 10px; + } +* html div.krumo-element { + padding-bottom: 3px; + } +a.krumo-name { + color:navy; + font: bold 13px Arial; + } +a.krumo-name big { + font: bold 20pt Georgia; + line-height: 14px; + position:relative; + top:2px; + left:-2px; + } +* html a.krumo-name big { + font: bold 19pt Georgia; + top: 5px; + left: 0px; + line-height: 9px; + height: 12px; + padding: 0px; + margin: 0px; + } +div.krumo-expand { + background: #AAD5FF; + cursor:pointer; + } +div.krumo-hover { + background: #FFBE7D; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-preview { + font: normal 13px courier new; + padding: 5px 5px 14px 5px; + background: white; + border-top: 0px; + overflow:auto; + white-space: pre; + } +* html div.krumo-preview { + padding-top: 2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-footnote { + background:white; + padding: 2px 5px; + list-style:none; + border-top: solid 1px #bebebe; + margin-top:2px; + cursor:default; + } +* html li.krumo-footnote { + line-height: 13px; + } +div.krumo-version { + float:right; + } +li.krumo-footnote h6 { + font: bold 11px verdana; + margin: 0px; + padding: 0px; + color:navy; + display:inline; + } +* html li.krumo-footnote h6 { + margin-right: 3px; + } +li.krumo-footnote a { + font: bold 10px arial; + color: #434343; + text-decoration:none; + } +li.krumo-footnote a:hover { + color:black; + } + +li.krumo-footnote span.krumo-call { + font:normal 11px verdana; + position: relative; + top: 1px; + } +li.krumo-footnote span.krumo-call code { + font-weight:bold; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-title { + font: normal 11px verdana ; + position:relative; + top:9px; + cursor:default; + line-height:2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +strong.krumo-array-length, +strong.krumo-string-length { + font-weight: normal; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/default/bg.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/default/bg.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/default/skin.css b/docroot/sites/all/modules/contrib/devel/krumo/skins/default/skin.css old mode 100755 new mode 100644 index 5c29d70fd..0fb87ef12 --- a/docroot/sites/all/modules/contrib/devel/krumo/skins/default/skin.css +++ b/docroot/sites/all/modules/contrib/devel/krumo/skins/default/skin.css @@ -1,158 +1,158 @@ -/** -* Krumo Default Skin -* -* @author Kaloyan K. Tsvetkov -*/ - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -ul.krumo-node { - margin: 0px; - padding: 0px; - } -ul.krumo-node ul { - margin-left: 20px; - } -* html ul.krumo-node ul { - margin-left: 24px; - } -div.krumo-root { - border: solid 1px black; - margin: 1em 0em; - } -ul.krumo-first { - font: normal 12px arial; - border: solid 2px white; - border-top-width:1px; - background: url(%url%bg.gif); - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-child { - display:block; - list-style: none; - padding: 0px; - margin: 0px; - overflow:hidden; - } -div.krumo-element { - cursor:default; - - line-height: 24px; - display:block; - - clear:both; - white-space:nowrap; - - border-top: solid 1px white; - background: #E8E8E8; - padding-left: 10px; - } -* html div.krumo-element { - padding-bottom: 3px; - } -a.krumo-name { - color:#2C5858; - font: bold 13px Arial; - } -a.krumo-name big { - font: bold 20pt Georgia; - line-height: 14px; - position:relative; - top:2px; - left:-2px; - } -* html a.krumo-name big { - font: bold 19pt Georgia; - top: 5px; - left: 0px; - line-height: 9px; - height: 12px; - padding: 0px; - margin: 0px; - } -div.krumo-expand { - background: #CCCCCC; - cursor:pointer; - } -div.krumo-hover { - background: #B7DBDB; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-preview { - font: normal 13px courier new; - padding: 5px 5px 14px 5px; - background: white; - border-top: 0px; - overflow:auto; - white-space: pre; - } -* html div.krumo-preview { - padding-top: 2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-footnote { - background:white; - padding: 2px 5px; - list-style:none; - border-top: solid 1px #bebebe; - margin-top:2px; - cursor:default; - } -* html li.krumo-footnote { - line-height: 13px; - } -div.krumo-version { - float:right; - } -li.krumo-footnote h6 { - font: bold 11px verdana; - margin: 0px; - padding: 0px; - color:#366D6D; - display:inline; - } -* html li.krumo-footnote h6 { - margin-right: 3px; - } -li.krumo-footnote a { - font: bold 10px arial; - color: #434343; - text-decoration:none; - } -li.krumo-footnote a:hover { - color:black; - } - -li.krumo-footnote span.krumo-call { - font:normal 11px verdana; - position: relative; - top: 1px; - } -li.krumo-footnote span.krumo-call code { - font-weight:bold; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-title { - font: normal 11px verdana ; - position:relative; - top:9px; - cursor:default; - line-height:2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -strong.krumo-array-length, -strong.krumo-string-length { - font-weight: normal; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ +/** +* Krumo Default Skin +* +* @author Kaloyan K. Tsvetkov +*/ + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +ul.krumo-node { + margin: 0px; + padding: 0px; + } +ul.krumo-node ul { + margin-left: 20px; + } +* html ul.krumo-node ul { + margin-left: 24px; + } +div.krumo-root { + border: solid 1px black; + margin: 1em 0em; + } +ul.krumo-first { + font: normal 12px arial; + border: solid 2px white; + border-top-width:1px; + background: url(%url%bg.gif); + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-child { + display:block; + list-style: none; + padding: 0px; + margin: 0px; + overflow:hidden; + } +div.krumo-element { + cursor:default; + + line-height: 24px; + display:block; + + clear:both; + white-space:nowrap; + + border-top: solid 1px white; + background: #E8E8E8; + padding-left: 10px; + } +* html div.krumo-element { + padding-bottom: 3px; + } +a.krumo-name { + color:#2C5858; + font: bold 13px Arial; + } +a.krumo-name big { + font: bold 20pt Georgia; + line-height: 14px; + position:relative; + top:2px; + left:-2px; + } +* html a.krumo-name big { + font: bold 19pt Georgia; + top: 5px; + left: 0px; + line-height: 9px; + height: 12px; + padding: 0px; + margin: 0px; + } +div.krumo-expand { + background: #CCCCCC; + cursor:pointer; + } +div.krumo-hover { + background: #B7DBDB; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-preview { + font: normal 13px courier new; + padding: 5px 5px 14px 5px; + background: white; + border-top: 0px; + overflow:auto; + white-space: pre; + } +* html div.krumo-preview { + padding-top: 2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-footnote { + background:white; + padding: 2px 5px; + list-style:none; + border-top: solid 1px #bebebe; + margin-top:2px; + cursor:default; + } +* html li.krumo-footnote { + line-height: 13px; + } +div.krumo-version { + float:right; + } +li.krumo-footnote h6 { + font: bold 11px verdana; + margin: 0px; + padding: 0px; + color:#366D6D; + display:inline; + } +* html li.krumo-footnote h6 { + margin-right: 3px; + } +li.krumo-footnote a { + font: bold 10px arial; + color: #434343; + text-decoration:none; + } +li.krumo-footnote a:hover { + color:black; + } + +li.krumo-footnote span.krumo-call { + font:normal 11px verdana; + position: relative; + top: 1px; + } +li.krumo-footnote span.krumo-call code { + font-weight:bold; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-title { + font: normal 11px verdana ; + position:relative; + top:9px; + cursor:default; + line-height:2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +strong.krumo-array-length, +strong.krumo-string-length { + font-weight: normal; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/green/bg.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/green/bg.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/green/skin.css b/docroot/sites/all/modules/contrib/devel/krumo/skins/green/skin.css old mode 100755 new mode 100644 index ffaf189ec..6f985231b --- a/docroot/sites/all/modules/contrib/devel/krumo/skins/green/skin.css +++ b/docroot/sites/all/modules/contrib/devel/krumo/skins/green/skin.css @@ -1,158 +1,158 @@ -/** -* Krumo "Green" Skin -* -* @author Kaloyan K. Tsvetkov -*/ - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -ul.krumo-node { - margin: 0px; - padding: 0px; - } -ul.krumo-node ul { - margin-left: 20px; - } -* html ul.krumo-node ul { - margin-left: 24px; - } -div.krumo-root { - border: solid 1px black; - margin: 1em 0em; - } -ul.krumo-first { - font: normal 12px arial; - border: solid 2px white; - border-top-width:1px; - background: url(%url%bg.gif); - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-child { - display:block; - list-style: none; - padding: 0px; - margin: 0px; - overflow:hidden; - } -div.krumo-element { - cursor:default; - - line-height: 24px; - display:block; - - clear:both; - white-space:nowrap; - - border-top: solid 1px white; - background: #D7F4CA; - padding-left: 10px; - } -* html div.krumo-element { - padding-bottom: 3px; - } -a.krumo-name { - color:#004000; - font: bold 13px Arial; - } -a.krumo-name big { - font: bold 20pt Georgia; - line-height: 14px; - position:relative; - top:2px; - left:-2px; - } -* html a.krumo-name big { - font: bold 19pt Georgia; - top: 5px; - left: 0px; - line-height: 9px; - height: 12px; - padding: 0px; - margin: 0px; - } -div.krumo-expand { - background: #C0EEAC; - cursor:pointer; - } -div.krumo-hover { - background: gold; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-preview { - font: normal 13px courier new; - padding: 5px 5px 14px 5px; - background: white; - border-top: 0px; - overflow:auto; - white-space: pre; - } -* html div.krumo-preview { - padding-top: 2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-footnote { - background:white; - padding: 2px 5px; - list-style:none; - border-top: solid 1px #bebebe; - margin-top:2px; - cursor:default; - } -* html li.krumo-footnote { - line-height: 13px; - } -div.krumo-version { - float:right; - } -li.krumo-footnote h6 { - font: bold 11px verdana; - margin: 0px; - padding: 0px; - color:#008040; - display:inline; - } -* html li.krumo-footnote h6 { - margin-right: 3px; - } -li.krumo-footnote a { - font: bold 10px arial; - color: #434343; - text-decoration:none; - } -li.krumo-footnote a:hover { - color:black; - } - -li.krumo-footnote span.krumo-call { - font:normal 11px verdana; - position: relative; - top: 1px; - } -li.krumo-footnote span.krumo-call code { - font-weight:bold; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-title { - font: normal 11px verdana ; - position:relative; - top:9px; - cursor:default; - line-height:2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -strong.krumo-array-length, -strong.krumo-string-length { - font-weight: normal; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ +/** +* Krumo "Green" Skin +* +* @author Kaloyan K. Tsvetkov +*/ + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +ul.krumo-node { + margin: 0px; + padding: 0px; + } +ul.krumo-node ul { + margin-left: 20px; + } +* html ul.krumo-node ul { + margin-left: 24px; + } +div.krumo-root { + border: solid 1px black; + margin: 1em 0em; + } +ul.krumo-first { + font: normal 12px arial; + border: solid 2px white; + border-top-width:1px; + background: url(%url%bg.gif); + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-child { + display:block; + list-style: none; + padding: 0px; + margin: 0px; + overflow:hidden; + } +div.krumo-element { + cursor:default; + + line-height: 24px; + display:block; + + clear:both; + white-space:nowrap; + + border-top: solid 1px white; + background: #D7F4CA; + padding-left: 10px; + } +* html div.krumo-element { + padding-bottom: 3px; + } +a.krumo-name { + color:#004000; + font: bold 13px Arial; + } +a.krumo-name big { + font: bold 20pt Georgia; + line-height: 14px; + position:relative; + top:2px; + left:-2px; + } +* html a.krumo-name big { + font: bold 19pt Georgia; + top: 5px; + left: 0px; + line-height: 9px; + height: 12px; + padding: 0px; + margin: 0px; + } +div.krumo-expand { + background: #C0EEAC; + cursor:pointer; + } +div.krumo-hover { + background: gold; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-preview { + font: normal 13px courier new; + padding: 5px 5px 14px 5px; + background: white; + border-top: 0px; + overflow:auto; + white-space: pre; + } +* html div.krumo-preview { + padding-top: 2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-footnote { + background:white; + padding: 2px 5px; + list-style:none; + border-top: solid 1px #bebebe; + margin-top:2px; + cursor:default; + } +* html li.krumo-footnote { + line-height: 13px; + } +div.krumo-version { + float:right; + } +li.krumo-footnote h6 { + font: bold 11px verdana; + margin: 0px; + padding: 0px; + color:#008040; + display:inline; + } +* html li.krumo-footnote h6 { + margin-right: 3px; + } +li.krumo-footnote a { + font: bold 10px arial; + color: #434343; + text-decoration:none; + } +li.krumo-footnote a:hover { + color:black; + } + +li.krumo-footnote span.krumo-call { + font:normal 11px verdana; + position: relative; + top: 1px; + } +li.krumo-footnote span.krumo-call code { + font-weight:bold; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-title { + font: normal 11px verdana ; + position:relative; + top:9px; + cursor:default; + line-height:2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +strong.krumo-array-length, +strong.krumo-string-length { + font-weight: normal; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/orange/bg.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/orange/bg.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/orange/skin.css b/docroot/sites/all/modules/contrib/devel/krumo/skins/orange/skin.css old mode 100755 new mode 100644 index 840680cc9..0a54da3b4 --- a/docroot/sites/all/modules/contrib/devel/krumo/skins/orange/skin.css +++ b/docroot/sites/all/modules/contrib/devel/krumo/skins/orange/skin.css @@ -1,158 +1,158 @@ -/** -* Krumo "Orange" Skin -* -* @author Kaloyan K. Tsvetkov -*/ - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -ul.krumo-node { - margin: 0px; - padding: 0px; - } -ul.krumo-node ul { - margin-left: 20px; - } -* html ul.krumo-node ul { - margin-left: 24px; - } -div.krumo-root { - border: solid 1px black; - margin: 1em 0em; - } -ul.krumo-first { - font: normal 12px arial; - border: solid 2px white; - border-top-width:1px; - background: url(%url%bg.gif); - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-child { - display:block; - list-style: none; - padding: 0px; - margin: 0px; - overflow:hidden; - } -div.krumo-element { - cursor:default; - - line-height: 24px; - display:block; - - clear:both; - white-space:nowrap; - - border-top: solid 1px white; - background: #FCEBA9; - padding-left: 10px; - } -* html div.krumo-element { - padding-bottom: 3px; - } -a.krumo-name { - color:#404000; - font: bold 13px Arial; - } -a.krumo-name big { - font: bold 20pt Georgia; - line-height: 14px; - position:relative; - top:2px; - left:-2px; - } -* html a.krumo-name big { - font: bold 19pt Georgia; - top: 5px; - left: 0px; - line-height: 9px; - height: 12px; - padding: 0px; - margin: 0px; - } -div.krumo-expand { - background: #FADB61; - cursor:pointer; - } -div.krumo-hover { - background: #FF8A4B; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-preview { - font: normal 13px courier new; - padding: 5px 5px 14px 5px; - background: white; - border-top: 0px; - overflow:auto; - white-space: pre; - } -* html div.krumo-preview { - padding-top: 2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-footnote { - background:white; - padding: 2px 5px; - list-style:none; - border-top: solid 1px #bebebe; - margin-top:2px; - cursor:default; - } -* html li.krumo-footnote { - line-height: 13px; - } -div.krumo-version { - float:right; - } -li.krumo-footnote h6 { - font: bold 11px verdana; - margin: 0px; - padding: 0px; - color:#E87400; - display:inline; - } -* html li.krumo-footnote h6 { - margin-right: 3px; - } -li.krumo-footnote a { - font: bold 10px arial; - color: #434343; - text-decoration:none; - } -li.krumo-footnote a:hover { - color:black; - } - -li.krumo-footnote span.krumo-call { - font:normal 11px verdana; - position: relative; - top: 1px; - } -li.krumo-footnote span.krumo-call code { - font-weight:bold; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-title { - font: normal 11px verdana ; - position:relative; - top:9px; - cursor:default; - line-height:2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -strong.krumo-array-length, -strong.krumo-string-length { - font-weight: normal; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ +/** +* Krumo "Orange" Skin +* +* @author Kaloyan K. Tsvetkov +*/ + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +ul.krumo-node { + margin: 0px; + padding: 0px; + } +ul.krumo-node ul { + margin-left: 20px; + } +* html ul.krumo-node ul { + margin-left: 24px; + } +div.krumo-root { + border: solid 1px black; + margin: 1em 0em; + } +ul.krumo-first { + font: normal 12px arial; + border: solid 2px white; + border-top-width:1px; + background: url(%url%bg.gif); + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-child { + display:block; + list-style: none; + padding: 0px; + margin: 0px; + overflow:hidden; + } +div.krumo-element { + cursor:default; + + line-height: 24px; + display:block; + + clear:both; + white-space:nowrap; + + border-top: solid 1px white; + background: #FCEBA9; + padding-left: 10px; + } +* html div.krumo-element { + padding-bottom: 3px; + } +a.krumo-name { + color:#404000; + font: bold 13px Arial; + } +a.krumo-name big { + font: bold 20pt Georgia; + line-height: 14px; + position:relative; + top:2px; + left:-2px; + } +* html a.krumo-name big { + font: bold 19pt Georgia; + top: 5px; + left: 0px; + line-height: 9px; + height: 12px; + padding: 0px; + margin: 0px; + } +div.krumo-expand { + background: #FADB61; + cursor:pointer; + } +div.krumo-hover { + background: #FF8A4B; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-preview { + font: normal 13px courier new; + padding: 5px 5px 14px 5px; + background: white; + border-top: 0px; + overflow:auto; + white-space: pre; + } +* html div.krumo-preview { + padding-top: 2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-footnote { + background:white; + padding: 2px 5px; + list-style:none; + border-top: solid 1px #bebebe; + margin-top:2px; + cursor:default; + } +* html li.krumo-footnote { + line-height: 13px; + } +div.krumo-version { + float:right; + } +li.krumo-footnote h6 { + font: bold 11px verdana; + margin: 0px; + padding: 0px; + color:#E87400; + display:inline; + } +* html li.krumo-footnote h6 { + margin-right: 3px; + } +li.krumo-footnote a { + font: bold 10px arial; + color: #434343; + text-decoration:none; + } +li.krumo-footnote a:hover { + color:black; + } + +li.krumo-footnote span.krumo-call { + font:normal 11px verdana; + position: relative; + top: 1px; + } +li.krumo-footnote span.krumo-call code { + font-weight:bold; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-title { + font: normal 11px verdana ; + position:relative; + top:9px; + cursor:default; + line-height:2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +strong.krumo-array-length, +strong.krumo-string-length { + font-weight: normal; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/white/collapsed.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/white/collapsed.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/white/dotted.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/white/dotted.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/white/empty.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/white/empty.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/white/expanded.gif b/docroot/sites/all/modules/contrib/devel/krumo/skins/white/expanded.gif old mode 100755 new mode 100644 diff --git a/docroot/sites/all/modules/contrib/devel/krumo/skins/white/skin.css b/docroot/sites/all/modules/contrib/devel/krumo/skins/white/skin.css old mode 100755 new mode 100644 index 84f72fd4b..bdcad3c1f --- a/docroot/sites/all/modules/contrib/devel/krumo/skins/white/skin.css +++ b/docroot/sites/all/modules/contrib/devel/krumo/skins/white/skin.css @@ -1,165 +1,165 @@ -/** -* Krumo `Schablon.com` Skin -* -* @author Kaloyan K. Tsvetkov -*/ - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -ul.krumo-node { - margin: 0px; - padding: 0px; - background-color: white; - } -ul.krumo-node ul { - margin-left: 20px; - } -* html ul.krumo-node ul { - margin-left: 24px; - } -div.krumo-root { - border: solid 1px black; - margin: 1em 0em; - } -ul.krumo-first { - font: normal 11px tahoma, verdana; - border: solid 1px white; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-child { - display:block; - list-style: none; - padding: 0px; - margin: 0px; - overflow:hidden; - } -div.krumo-element { - cursor:default; - display:block; - clear:both; - white-space:nowrap; - - background-color: white; - background-image: url(%url%empty.gif); - background-repeat: no-repeat; - background-position: 6px 5px; - padding: 2px 0px 3px 20px; - } -* html div.krumo-element { - padding-bottom: 3px; - line-height: 13px; - } -div.krumo-expand { - background-image: url(%url%collapsed.gif); - cursor:pointer; - } -div.krumo-hover { - background-color: #BFDFFF; - } -div.krumo-opened { - background-image: url(%url%expanded.gif); - } -a.krumo-name { - color:navy; - font: bold 13px courier new; - line-height:12px; - } -a.krumo-name big { - font: bold 16pt Georgia; - line-height: 10px; - position:relative; - top:2px; - left:-2px; - } -* html a.krumo-name big { - font: bold 15pt Georgia; - float:left; - top: -5px; - left: 0px; - padding: 0px; - margin: 0px; - } -em.krumo-type { - font-style:normal; - margin: 0px 2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-preview { - font: normal 13px courier new; - padding: 5px ; - background: lightyellow; - border: solid 1px #808000; - overflow:auto; - margin: 5px 1em 1em 0px; - white-space: pre; - } -* html div.krumo-preview { - padding-top: 2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -li.krumo-footnote { - background: white url(%url%dotted.gif) repeat-x; - padding: 4px 5px 3px 5px; - list-style:none; - cursor:default; - } -* html li.krumo-footnote { - line-height: 13px; - } -div.krumo-version { - float:right; - } -li.krumo-footnote h6 { - font: bold 11px verdana; - margin: 0px; - padding: 0px; - color:navy; - display:inline; - } -* html li.krumo-footnote h6 { - margin-right: 3px; - } -li.krumo-footnote a { - font: bold 10px arial; - color: #434343; - text-decoration:none; - } -li.krumo-footnote a:hover { - color:black; - } - - -li.krumo-footnote span.krumo-call { - font:normal 11px tahoma, verdana; - position: relative; - top: 1px; - } -li.krumo-footnote span.krumo-call code { - font-weight:bold; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -div.krumo-title { - font: normal 11px tahoma, verdana; - position:relative; - top:9px; - cursor:default; - line-height:2px; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ - -strong.krumo-array-length, -strong.krumo-string-length { - font-weight: normal; - color: #000099; - } - -/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ +/** +* Krumo `Schablon.com` Skin +* +* @author Kaloyan K. Tsvetkov +*/ + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +ul.krumo-node { + margin: 0px; + padding: 0px; + background-color: white; + } +ul.krumo-node ul { + margin-left: 20px; + } +* html ul.krumo-node ul { + margin-left: 24px; + } +div.krumo-root { + border: solid 1px black; + margin: 1em 0em; + } +ul.krumo-first { + font: normal 11px tahoma, verdana; + border: solid 1px white; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-child { + display:block; + list-style: none; + padding: 0px; + margin: 0px; + overflow:hidden; + } +div.krumo-element { + cursor:default; + display:block; + clear:both; + white-space:nowrap; + + background-color: white; + background-image: url(%url%empty.gif); + background-repeat: no-repeat; + background-position: 6px 5px; + padding: 2px 0px 3px 20px; + } +* html div.krumo-element { + padding-bottom: 3px; + line-height: 13px; + } +div.krumo-expand { + background-image: url(%url%collapsed.gif); + cursor:pointer; + } +div.krumo-hover { + background-color: #BFDFFF; + } +div.krumo-opened { + background-image: url(%url%expanded.gif); + } +a.krumo-name { + color:navy; + font: bold 13px courier new; + line-height:12px; + } +a.krumo-name big { + font: bold 16pt Georgia; + line-height: 10px; + position:relative; + top:2px; + left:-2px; + } +* html a.krumo-name big { + font: bold 15pt Georgia; + float:left; + top: -5px; + left: 0px; + padding: 0px; + margin: 0px; + } +em.krumo-type { + font-style:normal; + margin: 0px 2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-preview { + font: normal 13px courier new; + padding: 5px ; + background: lightyellow; + border: solid 1px #808000; + overflow:auto; + margin: 5px 1em 1em 0px; + white-space: pre; + } +* html div.krumo-preview { + padding-top: 2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +li.krumo-footnote { + background: white url(%url%dotted.gif) repeat-x; + padding: 4px 5px 3px 5px; + list-style:none; + cursor:default; + } +* html li.krumo-footnote { + line-height: 13px; + } +div.krumo-version { + float:right; + } +li.krumo-footnote h6 { + font: bold 11px verdana; + margin: 0px; + padding: 0px; + color:navy; + display:inline; + } +* html li.krumo-footnote h6 { + margin-right: 3px; + } +li.krumo-footnote a { + font: bold 10px arial; + color: #434343; + text-decoration:none; + } +li.krumo-footnote a:hover { + color:black; + } + + +li.krumo-footnote span.krumo-call { + font:normal 11px tahoma, verdana; + position: relative; + top: 1px; + } +li.krumo-footnote span.krumo-call code { + font-weight:bold; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +div.krumo-title { + font: normal 11px tahoma, verdana; + position:relative; + top:9px; + cursor:default; + line-height:2px; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ + +strong.krumo-array-length, +strong.krumo-string-length { + font-weight: normal; + color: #000099; + } + +/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */ diff --git a/docroot/sites/all/modules/contrib/dkan_acquia_expire/README.md b/docroot/sites/all/modules/contrib/dkan_acquia_expire/README.md new file mode 100644 index 000000000..a613bce4f --- /dev/null +++ b/docroot/sites/all/modules/contrib/dkan_acquia_expire/README.md @@ -0,0 +1,3 @@ +# DKAN Acquia Expire + +Expire module settings for DKAN. For use with Varnish, etc. diff --git a/docroot/sites/all/modules/contrib/dkan_acquia_search_solr/README.md b/docroot/sites/all/modules/contrib/dkan_acquia_search_solr/README.md new file mode 100644 index 000000000..3472a3f27 --- /dev/null +++ b/docroot/sites/all/modules/contrib/dkan_acquia_search_solr/README.md @@ -0,0 +1,2 @@ +# dkan_acquia_search_solr +Solr Search Settings for Local and Acquia Environments. diff --git a/docroot/sites/all/modules/contrib/dkan_health_status/README.md b/docroot/sites/all/modules/contrib/dkan_health_status/README.md new file mode 100644 index 000000000..bcc275e5d --- /dev/null +++ b/docroot/sites/all/modules/contrib/dkan_health_status/README.md @@ -0,0 +1,11 @@ +# DKAN Health Status Check + +This as adopted from http://drupal.org/project/health but slipped down. The UI and cron were removed and the base module is just 125 lines. + +### Add health checks + +To add health checks see ``dkan_health_status.checks.inc``. Implement ``hook_dkan_health_status_monitors``. The key in your array will provide the health check id as well as a an endpoint ``/health/dkan/check_key``. + +### Setup + +You mush add ``$conf['dkan_health_status_health_api_access_key'] = "API_KEY"`` to ``settings.php``. The API_KEY is used to request the check: ``/health/dkan/check_key?key=API_KEY`` diff --git a/docroot/sites/all/modules/contrib/environment/README.txt b/docroot/sites/all/modules/contrib/environment/README.txt new file mode 100644 index 000000000..33992e6df --- /dev/null +++ b/docroot/sites/all/modules/contrib/environment/README.txt @@ -0,0 +1,84 @@ + +ENVIRONMENT + +Creates an API for specifying an environment for a site instance. Other modules +may then change their logic depending upon the current active environment. When +switching environments a hook is invoked to allow any module to run additional +required actions. + +The environment states are defined for use in hook_environment() and so +may be unique to the current project. Predefined environments are 'development' +and 'production'. + +This module provides a UI to facilitate basic use, but is at heart a +developer's module, providing the ability to perform site operations as +part of a state machine transition. + +Environment module now support now supports multiple environments per site. The +"default" workflow environment is the same as previous module behavior, and +includes the sample environment states of "development" and "production". +Creating new workflows is a developer task, much as creating new environment +states. + +USING DRUSH + +Environment provides two drush commands, 'environment' and +'environment-switch'. Environment tells you the current environment, +environment-switch toggles the current environment state as you declare. +For usage instructions, turn on the Environment module and type `drush +help environment` and `drush help environment-switch`. + +FOR DEVELOPERS + +'environment.api.php' describes the use of hook_environment() to define +new environment states, hook_environment_alter() to tweak those +definitions, and hook_environment_switch() to trigger any environment +change operations defined in any module of your site. + +To create new workflows, implement hook_environment_workflow() and at least +define a label element. To categorize an environment state as part of a given +workflow, just add that element to the environment definition. + +The `environment_allowed()` function is a method for asserting behaviors +predefined as permitted or not permitted in the environment definition. + +FOR ADMINISTRATORS + +Once installed, you can toggle the current environment amongst any +defined by visiting 'admin/settings/environment'. This will do nothing +unless the site has been built to do something depending on the current +environment. + +Sites which make heavy use of the Environment module may choke if you +try to use the UI to toggle the environment state. In that case, you may +want to use `hook_form_alter()` to hide that option. + +If you prefer to manage environment states entirely in code, you can +check on 'Require environment override', this will help you enforce that +an `environment_override` variable defined in your settings.php file is +correctly used as your environment. You may also simply define the +`environment` variable, but you will then lose some of the extra UI help +that explains why the UI no longer updates the environment state. + +When you define the environment state in settings.php, you will still +need to run `drush env-switch` to update the environment to that state, +possibly using the --force flag if the system thinks it is already in +that state. + +Check 'admin/reports/status' for any problems with your Environment +configuration. + +FOR SITE BUILDERS + +The Environment module provides Token and Context integration to +facilitate building actual functionality around your current +environment. This is primarily envisioned as mechanisms to help inform +the current site user of the current environment. If you do anything +inventive, be sure to let us know! + +There are 'environment' and 'environment-label' tokens that will show +the machine name or human title for the current environment. + +There is also an Environment condition for the Context module that will +allow you to trigger block placement or other context reactions based on +the site environment. diff --git a/docroot/sites/all/modules/contrib/environment_indicator/README.txt b/docroot/sites/all/modules/contrib/environment_indicator/README.txt new file mode 100644 index 000000000..1b647158c --- /dev/null +++ b/docroot/sites/all/modules/contrib/environment_indicator/README.txt @@ -0,0 +1,78 @@ + +-- SUMMARY -- + +Environment Indicator adds a coloured strip to the site informing the user which +environment they are in (Development, Staging Production etc). + +For a full description visit the project page: + http://drupal.org/project/environment_indicator + +Bug reports, feature suggestions and latest developments: + http://drupal.org/project/issues/environment_indicator + + +-- REQUIREMENTS -- + +* CTools + + +-- INSTALLATION -- + +* Install as usual, see http://drupal.org/node/70151 for further information. + + +-- CONFIGURATION -- + +You may configure the environment at /admin/settings/environment-indicator + +You can also override settings in settings.php, allowing you to have different +settings for each of your environments. If you choose to detect your environment +using settings.php, then all configuration variables can be overridden in +settings.php, but the most common three are: + + - environment_indicator_overwrite + A boolean value indicating whether the Environment Indicator should use + the settings.php variables for the indicator. On your production + environment, you should probably set this to FALSE. e.g: + $conf['environment_indicator_overwrite'] = FALSE + - environment_indicator_overwritten_name + The text that will be displayed on the indicator. e.g: + $conf['environment_indicator_overwritten_name'] = 'Staging' + - environment_indicator_overwritten_color + A valid css color. e.g: + $conf['environment_indicator_overwritten_color'] = '#ff5555' + - environment_indicator_overwritten_position + Where your indicator may appear. Allowed values are "top" and "bottom". + e.g: + $conf['environment_indicator_overwritten_position'] = 'top' + - environment_indicator_overwritten_fixed + A boolean value indicating whether the Environment Indicator should be + fixed at the top/bottom of the screen. e.g: + $conf['environment_indicator_overwritten_fixed'] = FALSE + - environment_indicator_favicon_overlay + A boolean value indicating whether the Environment Indicator should + overlay the favicon with the current environment's information. e.g.: + $conf['environment_indicator_favicon_overlay'] = TRUE + +-- ACQUIA CLOUD INTEGRATION -- + +Copy the file in samples/environment-indicator.sh to your +hooks/[your-environment]/post-code-deploy folder and give it execution +permissions. Replace [your-environment] by your environment site alias or use +'common' to use it in all your environments (recommended). This integration +relies on the presence of the environment variable AH_SITE_ENVIRONMENT. + +You can read more about Cloud Hooks in +https://github.com/acquia/cloud-hooks/blob/master/README.md + +-- CONTACT -- + +Author maintainers: +* Tom Kirkpatrick (mrfelton), www.systemseed.com. Branches 6.x-1.x, 7.x-1.x +* Mateu Aguiló (e0ipso). Branch 7.x-2.x + + +This project has been partially sponsored by: +* SystemSeed - Visit http://www.systemseed.com for more information. Branches + 6.x-1.x, 7.x-1.x +* Lullabot - Visit http://www.lullabot.com for more information. Branch 7.x-2.x diff --git a/docroot/sites/all/modules/contrib/fast_404/README.TXT b/docroot/sites/all/modules/contrib/fast_404/README.TXT new file mode 100644 index 000000000..1856e0e32 --- /dev/null +++ b/docroot/sites/all/modules/contrib/fast_404/README.TXT @@ -0,0 +1,192 @@ +Fast_404 is Super Fast and Super Amazing. It is also very aggressive and +hard-core. +BE CAREFUL! TEST YOUR SITE THOROUGHLY AFTER ENABLING! + + +INSTALLATION INSTRUCTIONS + +Basic Install *NOTE, THIS ONLY CHECKS STATIC FILES AND NOT DRUPAL PATHS* +(no settings.php modifications needed) +Step 1. Upload the module to your standard modules location (usually + sites/all/modules). +Step 2. Enable the module in your modules page + +Advanced Install +Step 1. Upload the module to your standard modules location (usually + sites/all/modules). +Step 2. Place the code at the bottom of this file into your settings.php file +Step 3. Optionally, modify the include_once path if you did not put the module + in sites/all/modules +Step 4. Enable the module in your modules page + +-- Getting Extra Speed out of the Advanced Install -- + +#1) Check extensions from settings.php, not hook_boot. + + This method is faster as it checks for missing static files at bootstrap + stage 3 rather than 7 when the module's hook_boot() is called. Also, if you + are using aggressive or external caching, hook_boot is skipped, so you will + *need* to do this. + + To enable this functionality, uncomment the line below near the bottom of the + settings.php code: + + //fast_404_ext_check(); + +#2) Enable Drupal path checking + + This checks to see if the URL you being visited actually corresponds to a + real page in Drupal. This feature has 2 switches: + + a). Global switch to turn this checking on and off: + $conf['fast_404_path_check'] = FALSE; + + b). To perform this check in settings.php for the same reasons as listed + above for the static file checking uncomment the following line in the + settings.php code: + //fast_404_path_check(); + +#3) Give the static file checking a kick in the pants! + + Static file checking does require you to keep an eye on the extension list + as well as a bit of extra work with the preg_match (OK, a very small amount). + Optionally, you can use whitelisting rather than blacklisting. To turn this + on alter this setting in the settings.php: + $conf['fast_404_url_whitelisting'] = FALSE; + + This setting requires you to do some serious testing to ensure your site's + pages are all still loading. Also make sure this list is accurate for your + site: + + $conf['fast_404_whitelist'] = array('index.php', 'rss.xml', 'install.php', 'cron.php', 'update.php', 'xmlrpc.php'); + +#4) Disallow imagecache file creation for anonymous users (NEW!) + + Normally the module skips out if imagecache is in the URL to the static file. + There are times when you may not want this (it would be pretty easy for + someone to take down your site by simply hammering you with URLs with + imagecache in them. + + In an ideal situation, your logged in users should have verified the pages + are loading correctly when they create them, so any needed imagecache images + are already made. This new setting will make it so that imagecache URLs are + not excluded and fall under the same static file rules as non-imagecache + URLs. Set to false to enable this new feature. + + $conf['fast_404_allow_anon_imagecache'] = TRUE; + +#5) Prevent conflicts with other modules (NEW!) + + Some performance modules create paths to files which don't exist on disk. + These modules conflict with fast_404. To workaround this limitation, you + can whitelist the URL fragments used by these modules. + + For example if you are using the CDN module and have the far future date + feature enabled add the following configuration: + + $conf['fast_404_string_whitelisting'] = array('cdn/farfuture'); + + If you are using AdvAgg you can use this: + $conf['fast_404_string_whitelisting'] = array('/advagg_'); + + +----------------------------------------------------------------- +--- Copy the code below into the BOTTOM of your settings.php. --- +--- If you are using cacherouter, put this above cacherouter. --- +----------------------------------------------------------------- + +/** + * Fast 404 settings: + * + * Fast 404 will do two separate types of 404 checking. + * + * The first is to check for URLs which appear to be files or images. If Drupal + * is handling these items, then they were not found in the file system and are + * a 404. + * + * The second is to check whether or not the URL exists in Drupal by checking + * with the menu router, aliases and redirects. If the page does not exist, we + * will server a fast 404 error and exit. + */ + +# Load the fast_404.inc file. This is needed if you wish to do extension +# checking in settings.php. +include_once('./sites/all/modules/fast_404/fast_404.inc'); + +# Disallowed extensions. Any extension in here will not be served by Drupal and +# will get a fast 404. +# Default extension list, this is considered safe and is even in queue for +# Drupal 8 (see: http://drupal.org/node/76824). +$conf['fast_404_exts'] = '/^(?!robots).*\.(txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; + +# If you use a private file system use the conf variable below and change the +# 'sites/default/private' to your actual private files path +# $conf['fast_404_exts'] = '/^(?!robots)^(?!sites\/default\/private).*\.(txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; + +# If you are using the Advanced Help module, the following config may be used +# to allow paths starting with 'help'. +$conf['fast_404_exts'] = '/^(?!help\/)(?!robots).*\.(txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/'; + +# If you would prefer a stronger version of NO then return a 410 instead of a +# 404. This informs clients that not only is the resource currently not present +# but that it is not coming back and kindly do not ask again for it. +# Reference: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes +# $conf['fast_404_return_gone'] = TRUE; + +# Allow anonymous users to hit URLs containing 'imagecache' even if the file +# does not exist. TRUE is default behavior. If you know all imagecache +# variations are already made set this to FALSE. +$conf['fast_404_allow_anon_imagecache'] = TRUE; + +# If you use FastCGI, uncomment this line to send the type of header it needs. +# Reference: http://php.net/manual/en/function.header.php +# $conf['fast_404_HTTP_status_method'] = 'FastCGI'; + +# Extension list requiring whitelisting to be activated **If you use this +# without whitelisting enabled your site will not load! +//$conf['fast_404_exts'] = '/\.(txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp|php|html?|xml)$/i'; + +# Default fast 404 error message. +$conf['fast_404_html'] = '404 Not Found

Not Found

The requested URL "@path" was not found on this server.

'; + +# Check paths during bootstrap and see if they are legitimate. +$conf['fast_404_path_check'] = FALSE; + +# If enabled, you may add extensions such as xml and php to the +# $conf['fast_404_exts'] above. BE CAREFUL with this setting as some modules +# use their own php files and you need to be certain they do not bootstrap +# Drupal. If they do, you will need to whitelist them too. +$conf['fast_404_url_whitelisting'] = FALSE; + +# Array of whitelisted files/urls. Used if whitelisting is set to TRUE. +$conf['fast_404_whitelist'] = array('index.php', 'rss.xml', 'install.php', 'cron.php', 'update.php', 'xmlrpc.php'); + +# Array of whitelisted URL fragment strings that conflict with fast_404. +$conf['fast_404_string_whitelisting'] = array('cdn/farfuture', '/advagg_'); + +# By default we will show a super plain 404, because usually errors like this are shown to browsers who only look at the headers. +# However, some cases (usually when checking paths for Drupal pages) you may want to show a regular 404 error. In this case you can +# specify a URL to another page and it will be read and displayed (it can't be redirected to because we have to give a 30x header to +# do that. This page needs to be in your docroot. +#$conf['fast_404_HTML_error_page'] = './my_page.html'; + +# By default the custom 404 page is only loaded for path checking. Load it for all 404s with the below option set to TRUE +$conf['fast_404_HTML_error_all_paths'] = FALSE; + +# Call the extension checking now. This will skip any logging of 404s. +# Extension checking is safe to do from settings.php. There are many +# examples of this on Drupal.org. +//fast_404_ext_check(); + +# Path checking. USE AT YOUR OWN RISK (only works with MySQL). +# Path checking at this phase is more dangerous, but faster. Normally +# Fast_404 will check paths during Drupal boostrap via hook_boot. Checking +# paths here is faster, but trickier as the Drupal database connections have +# not yet been made and the module must make a separate DB connection. Under +# most configurations this DB connection will be reused by Drupal so there +# is no waste. +# While this setting finds 404s faster, it adds a bit more load time to +# regular pages, so only use if you are spending too much CPU/Memory/DB on +# 404s and the trade-off is worth it. +# This setting will deliver 404s with less than 2MB of RAM. +//fast_404_path_check(); diff --git a/docroot/sites/all/modules/contrib/google_analytics/README.txt b/docroot/sites/all/modules/contrib/google_analytics/README.txt new file mode 100644 index 000000000..25fd22aa7 --- /dev/null +++ b/docroot/sites/all/modules/contrib/google_analytics/README.txt @@ -0,0 +1,104 @@ + +Module: Google Analytics +Author: Alexander Hass + + +Description +=========== +Adds the Google Analytics tracking system to your website. + +Requirements +============ + +* Google Analytics user account + +Installation +============ +Copy the 'googleanalytics' module directory in to your Drupal +sites/all/modules directory as usual. + +Upgrading from 6.x-3.x and 7.x-1.x +================================== +If you upgrade from 6.x-3.x and 7.x-1.x (ga.js) to 7.x-2.x (analytics.js) you +should verify if you used custom variables. Write down your settings or make a +screenshot. You need to re-configure the settings to use custom dimensions or +metrics. There is no automatic upgrade path for custom variables feature. All +other module settings are upgraded automatically. + +See https://support.google.com/analytics/answer/2795983?hl=en for more details. + +Usage +===== +In the settings page enter your Google Analytics account number. + +All pages will now have the required JavaScript added to the +HTML footer can confirm this by viewing the page source from +your browser. + +Page specific tracking +====================== +The default is set to "Add to every page except the listed pages". By +default the following pages are listed for exclusion: + +admin +admin/* +batch +node/add* +node/*/* +user/*/* + +These defaults are changeable by the website administrator or any other +user with 'Administer Google Analytics' permission. + +Like the blocks visibility settings in Drupal core, there is a choice for +"Add if the following PHP code returns TRUE." Sample PHP snippets that can be +used in this textarea can be found on the handbook page "Overview-approach to +block visibility" at http://drupal.org/node/64135. + +Custom dimensions and metrics +============================= +One example for custom dimensions tracking is the "User roles" tracking. + +1. In the Google Analytics Management Interface (http://www.google.com/analytics/) + you need to setup Dimension #1 with name e.g. "User roles". This step is + required. Do not miss it, please. + +2. Enter the below configuration data into the Drupal custom dimensions settings + form under admin/config/system/googleanalytics. You can also choose another + index, but keep it always in sync with the index used in step #1. + + Index: 1 + Value: [current-user:role-names] + +More details about custom dimensions and metrics can be found in the Google API +documentation at https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets + +Advanced Settings +================= +You can include additional JavaScript snippets in the custom javascript +code textarea. These can be found on the official Google Analytics pages +and a few examples at http://drupal.org/node/248699. Support is not +provided for any customisations you include. + +To speed up page loading you may also cache the Google Analytics "analytics.js" +file locally. + +Manual JS debugging +=================== +For manual debugging of the JS code you are able to create a test node. This +is the example HTML code for this test node. You need to enable debugging mode +in your Drupal configuration of Google Analytics settings to see verbose +messages in your browsers JS console. + +Title: Google Analytics test page + +Body: + + +Text format: Full HTML diff --git a/docroot/sites/all/modules/contrib/google_tag/README.txt b/docroot/sites/all/modules/contrib/google_tag/README.txt new file mode 100644 index 000000000..5baf1b796 --- /dev/null +++ b/docroot/sites/all/modules/contrib/google_tag/README.txt @@ -0,0 +1,110 @@ + +CONTENTS OF THIS FILE +--------------------- + + * Introduction + * Requirements + * Recommended modules + * Installation + * Configuration + * Troubleshooting + * Maintainers + + +INTRODUCTION +------------ + +This Google Tag Manager project allows non-technical stakeholders to manage the +analytics for their website by triggering the insertion of tags and tracking +systems onto their page(s) via Google's Tag Manager (GTM) hosted application. + + * For a full description, visit the project page: + https://www.drupal.org/project/google_tag + + * To submit bug reports and feature suggestions, or to track changes: + https://www.drupal.org/project/issues/google_tag + + +REQUIREMENTS +------------ + +Sign up for GTM and obtain a 'container ID' for your website. Enter the +'container ID' on the settings form for this module (see Configuration). + + * https://www.google.com/analytics/tag-manager/ + + +INSTALLATION +------------ + +Place the project files in an appropriate modules directory and enable the +module as you would any other contributed module. For further information see: + + * https://www.drupal.org/node/895232 + + +CONFIGURATION +------------- + +Users in roles with the 'Administer Google Tag Manager' permission will be able +to manage the settings for this module. Configure permissions as usual at: + + * Administration » People » Permissions + * admin/people/permissions + +From the module settings page, configure the conditions on which the tags are +inserted on a page response. Conditions exist for: page paths, user roles, and +response statuses. See: + + * Administration » Configuration » System » Google Tag Manager + * admin/config/system/google_tag + +The module implements the Variable API, so that settings may be separately +configured by realm, thus enabling support for multiple languages and domains. +If these features are needed, then review the other projects at: + + * https://www.drupal.org/project/variable + * https://www.drupal.org/project/18n + * https://www.drupal.org/project/domain_variable + +For development purposes, create a GTM environment for your website and enter +the 'environment ID' on the 'Advanced' tab of the settings form. + + * https://tagmanager.google.com/#/admin + +For additional data layer management, consider the dataLayer module. It supports +the default name for the data layer. To use a non-default name, apply a patch to +the code from that module module. + + * https://www.drupal.org/project/dataLayer + + +TROUBLESHOOTING +--------------- + +If the JavaScript snippets are not present in the HTML output, try the following +steps to debug the situation: + + * Confirm the snippet files exist at public://google_tag/ (on most sites this + equates to sites/default/files/google_tag/). + + If missing, then visit the module settings page and submit the form to + recreate the snippet files. The need to do this may arise if the project is + deployed from one environment to another (e.g. development to production) but + the snippet files are not deployed. + + Due to a known bug during an update to releases 1.2-rc3 or 1.2, the snippet + directory is not created. A simple workaround for this bug is to disable and + enable the module (uninstall is not necessary). + + * Enable debug output on the 'Advanced' tab of the settings page to display the + result of each snippet insertion condition in the message area. Modify the + insertion conditions as needed. + + +MAINTAINERS +----------- + +Current maintainer: + + * Jim Berry (https://www.drupal.org/u/solotandem) diff --git a/docroot/sites/all/modules/contrib/maillog/README.txt b/docroot/sites/all/modules/contrib/maillog/README.txt new file mode 100644 index 000000000..815ad2cda --- /dev/null +++ b/docroot/sites/all/modules/contrib/maillog/README.txt @@ -0,0 +1,4 @@ + +This module defines drupal_mail_wrapper(), which takes over the handling of mail sending. This wrapper creates a node of type 'Logged Mail', a node type created by the module, sends the e-mail, and displays the e-mail and its details by using devel module API. All 3 tasks can be enabled/disabled from 'admin/settings/maillog'. + +The invoking of the handler depends on a system variable 'smtp_library'. Unfortunately, some modules may change the value of this variable, rendering the module dysfunctional. Simply disabling and re-enabling the module should fix this problem. Check 'admin/reports/status' to see the status of the SMTP library. \ No newline at end of file diff --git a/docroot/sites/all/modules/contrib/memcache/README.txt b/docroot/sites/all/modules/contrib/memcache/README.txt new file mode 100644 index 000000000..a7c39e64f --- /dev/null +++ b/docroot/sites/all/modules/contrib/memcache/README.txt @@ -0,0 +1,717 @@ +## IMPORTANT NOTE ## + +This file contains installation instructions for the 7.x-1.x version of the +Drupal Memcache module. Configuration differs between 7.x and 6.x versions +of the module, so be sure to follow the 6.x instructions if you are configuring +the 6.x-1.x version of this module! + +## REQUIREMENTS ## + +- PHP 5.1 or greater +- Availability of a memcached daemon: http://memcached.org/ +- One of the two PECL memcache packages: + - http://pecl.php.net/package/memcache (recommended) + - http://pecl.php.net/package/memcached (latest versions require PHP 5.2 or + greater) + +## INSTALLATION ## + +These are the steps you need to take in order to use this software. Order +is important. + + 1. Install the memcached binaries on your server and start the memcached + service. Follow best practices for securing the service; for example, + lock it down so only your web servers can make connections. Find community + maintained documentation with a number of walk-throughs for various + operating systems at https://www.drupal.org/node/1131458. + 2. Install your chosen PECL memcache extension -- this is the memcache client + library which will be used by the Drupal memcache module to interact with + the memcached server(s). Generally PECL memcache (3.0.6+) is recommended, + but PECL memcached (2.0.1+) also works well for some people. There are + known issues with older versions. Refer to the community maintained + documentation referenced above for more information. + 3. Put your site into offline mode. + 4. Download and install the memcache module. + 5. If you have previously been running the memcache module, run update.php. + 6. Optionally edit settings.php to configure the servers, clusters and bins + for memcache to use. If you skip this step the Drupal module will attempt to + talk to the memcache server on port 11211 on the local host, storing all + data in a single bin. This is sufficient for most smaller, single-server + installations. + 7. Edit settings.php to make memcache the default cache class, for example: + $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc'; + $conf['cache_default_class'] = 'MemCacheDrupal'; + The cache_backends path needs to be adjusted based on where you installed + the module. + 8. Make sure the following line also exists, to ensure that the special + cache_form bin is assigned to non-volatile storage: + $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; + 9. Optionally also add the following two lines to tell Drupal not to bootstrap + the database when serving cached pages to anonymous visitors: + $conf['page_cache_without_database'] = TRUE; + $conf['page_cache_invoke_hooks'] = FALSE; + If setting page_cache_without_database to TRUE, you also have to set + page_cache_invoke_hooks to FALSE or you'll see an error like "Fatal error: + Call to undefined function module_list()". +10. Bring your site back online. + +## DRUSH ## + +Enable the memcache module at admin/modules or with 'drush en memcache', then +rebuild the drush cache by running 'drush cc drush'. This will enable the +following drush commands: + + memcache-flush (mcf) Flush all Memcached objects in a bin. + memcache-stats (mcs) Retrieve statistics from Memcached. + +For more information about each command, use 'drush help'. For example: + drush help mcf + +Or: + drush help mcs + +## ADVANCED CONFIGURATION ## + +This module is capable of working with one memcached instance or with multiple +memcached instances run across one or more servers. The default is to use one +server accessible on localhost port 11211. If that meets your needs, then the +configuration settings outlined above are sufficient for the module to work. +If you want to use multiple memcached instances, or if you are connecting to a +memcached instance located on a remote machine, further configuration is +required. + +The available memcached servers are specified in $conf in settings.php. If you +do not specify any servers, memcache.inc assumes that you have a memcached +instance running on localhost:11211. If this is true, and it is the only +memcached instance you wish to use, no further configuration is required. + +If you have more than one memcached instance running, you need to add two arrays +to $conf; memcache_servers and memcache_bins. The arrays follow this pattern: + +'memcache_servers' => array( + server1:port => cluster1, + server2:port => cluster2, + serverN:port => clusterN, + 'unix:///path/to/socket' => clusterS +) + +'memcache_bins' => array( + bin1 => cluster1, + bin2 => cluster2, + binN => clusterN, + binS => clusterS +) + +You can optionally assign a weight to each server, favoring one server more than +another. For example, to make it 10 times more likely to store an item on +server1 versus server2: + +'memcache_servers' => array( + server1:port => array('cluster' => cluster1, 'weight' => 10), + server2:port => array('cluster' => cluster2, 'weight' => 1'), +) + +The bin/cluster/server model can be described as follows: + +- Servers are memcached instances identified by host:port. + +- Clusters are groups of servers that act as a memory pool. Each cluster can + contain one or more servers. + +- Bins are groups of data that get cached together and map 1:1 to the $table + parameter of cache_set(). Examples from Drupal core are cache_filter and + cache_menu. The default is 'cache'. + +- Multiple bins can be assigned to a cluster. + +- The default cluster is 'default'. + +## LOCKING ## + +The memcache-lock.inc file included with this module can be used as a drop-in +replacement for the database-mediated locking mechanism provided by Drupal +core. To enable, define the following in your settings.php: + + $conf['lock_inc'] = 'sites/all/modules/memcache/memcache-lock.inc'; + +Locks are written in the 'semaphore' table, which will map to the 'default' +memcache cluster unless you explicitly configure a 'semaphore' cluster. + +## STAMPEDE PROTECTION ## + +Memcache includes stampede protection for rebuilding expired and invalid cache +items. To enable stampede protection, define the following in settings.php: + + $conf['memcache_stampede_protection'] = TRUE; + +To avoid lock stampedes, it is important that you enable the memcache lock +implementation when enabling stampede protection -- enabling stampede protection +without enabling the Memcache lock implementation can cause worse performance and +can result in dropped locks due to key-length truncation. + +Memcache stampede protection is primarily designed to benefit the following +caching pattern: a miss on a cache_get() for a specific cid is immediately +followed by a cache_set() for that cid. Of course, this is not the only caching +pattern used in Drupal, so stampede protection can be selectively disabled for +optimal performance. For example, a cache miss in Drupal core's +module_implements() won't execute a cache_set until drupal_page_footer() +calls module_implements_write_cache() which can occur much later in page +generation. To avoid long hanging locks, stampede protection should be +disabled for these delayed caching patterns. + +Memcache stampede protection can be disabled for entire bins, specific cid's in +specific bins, or cid's starting with a specific prefix in specific bins. For +example: + + $conf['memcache_stampede_protection_ignore'] = array( + // Ignore some cids in 'cache_bootstrap'. + 'cache_bootstrap' => array( + 'module_implements', + 'variables', + 'lookup_cache', + 'schema:runtime:*', + 'theme_registry:runtime:*', + '_drupal_file_scan_cache', + ), + // Ignore all cids in the 'cache' bin starting with 'i18n:string:' + 'cache' => array( + 'i18n:string:*', + ), + // Disable stampede protection for the entire 'cache_path' and 'cache_rules' + // bins. + 'cache_path', + 'cache_rules', + ); + +Only change the following stampede protection tunables if you're sure you know +what you're doing, which requires first reading the memcache.inc code. + +The value passed to lock_acquire, defaults to '15': + $conf['memcache_stampede_semaphore'] = 15; + +The value passed to lock_wait, defaults to 5: + $conf['memcache_stampede_wait_time'] = 5; + +The maximum number of calls to lock_wait() due to stampede protection during a +single request, defaults to 3: + $conf['memcache_stampede_wait_limit'] = 3; + +When adjusting these variables, be aware that: + - there is unlikely to be a good use case for setting wait_time higher + than stampede_semaphore; + - wait_time * wait_limit is designed to default to a number less than + standard web server timeouts (i.e. 15 seconds vs. apache's default of + 30 seconds). + +## CACHE LIFETIME ## + +Memcache respects Drupal core's minimum cache lifetime configuration. This +setting affects all cached items, not just pages. In some cases, it may +be desirable to cache different types of items for different amounts of time. +You can override the minimum cache lifetime on a per-bin basis in settings.php. +For example: + + // Cache pages for 60 seconds. + $conf['cache_lifetime_cache_page'] = 60; + // Cache menus for 10 minutes. + $conf['cache_lifetime_menu'] = 600; + +## CACHE HEADER ## + +Drupal core indicates whether or not a page was served out of the cache by +setting the 'X-Drupal-Cache' response header with a value of HIT or MISS. If +you'd like to confirm whether pages are actually being retreived from Memcache +and not another backend, you can enable the following option: + + $conf['memcache_pagecache_header'] = TRUE; + +When enabled, the Memcache module will add its own 'Drupal-PageCache-Memcache' +header. When cached pages are served out of the cache the header will include an +'age=' value indicating how many seconds ago the page was stored in the cache. + +## PERSISTENT CONNECTIONS ## + +As of 7.x-1.6, the memcache module uses peristent connections by default. If +this causes you problems you can disable persistent connections by adding the +following to your settings.php: + + $conf['memcache_persistent'] = FALSE; + +## EXAMPLES ## + +Example 1: + +First, the most basic configuration which consists of one memcached instance +running on localhost port 11211 and all caches except for cache_form being +stored in memcache. We also enable stampede protection, and the memcache +locking mechanism. Finally, we tell Drupal to not bootstrap the database when +serving cached pages to anonymous visitors. + + $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc'; + $conf['lock_inc'] = 'sites/all/modules/memcache/memcache-lock.inc'; + $conf['memcache_stampede_protection'] = TRUE; + $conf['cache_default_class'] = 'MemCacheDrupal'; + + // The 'cache_form' bin must be assigned to non-volatile storage. + $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; + + // Don't bootstrap the database when serving pages from the cache. + $conf['page_cache_without_database'] = TRUE; + $conf['page_cache_invoke_hooks'] = FALSE; + +Note that no servers or bins are defined. The default server and bin +configuration which is used in this case is equivalant to setting: + + $conf['memcache_servers'] = array('localhost:11211' => 'default'); + + +Example 2: + +In this example we define three memcached instances, two accessed over the +network, and one on a Unix socket -- please note this is only an illustration of +what is possible, and is not a recommended configuration as it's highly unlikely +you'd want to configure memcache to use both sockets and network addresses like +this, instead you'd consistently use one or the other. + +The instance on port 11211 belongs to the 'default' cluster where everything +gets cached that isn't otherwise defined. (We refer to it as a "cluster", but in +this example our "clusters" involve only one instance.) The instance on port +11212 belongs to the 'pages' cluster, with the 'cache_page' table mapped to +it -- so the Drupal page cache is stored in this cluster. Finally, the instance +listening on a socket is part of the 'blocks' cluster, with the 'cache_block' +table mapped to it -- so the Drupal block cache is stored here. Note that +sockets do not have ports. + + $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc'; + $conf['lock_inc'] = 'sites/all/modules/memcache/memcache-lock.inc'; + $conf['memcache_stampede_protection'] = TRUE; + $conf['cache_default_class'] = 'MemCacheDrupal'; + + // The 'cache_form' bin must be assigned no non-volatile storage. + $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; + + // Don't bootstrap the database when serving pages from the cache. + $conf['page_cache_without_database'] = TRUE; + $conf['page_cache_invoke_hooks'] = FALSE; + + // Important to define a default cluster in both the servers + // and in the bins. This links them together. + $conf['memcache_servers'] = array('10.1.1.1:11211' => 'default', + '10.1.1.1:11212' => 'pages', + 'unix:///path/to/socket' => 'blocks'); + $conf['memcache_bins'] = array('cache' => 'default', + 'cache_page' => 'pages', + 'cache_block' => 'blocks'); + + +Example 3: + +Here is an example configuration that has two clusters, 'default' and +'cluster2'. Five memcached instances running on four different servers are +divided up between the two clusters. The 'cache_filter' and 'cache_menu' bins +go to 'cluster2'. All other bins go to 'default'. + + $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc'; + $conf['lock_inc'] = 'sites/all/modules/memcache/memcache-lock.inc'; + $conf['memcache_stampede_protection'] = TRUE; + $conf['cache_default_class'] = 'MemCacheDrupal'; + + // The 'cache_form' bin must be assigned no non-volatile storage. + $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; + + // Don't bootstrap the database when serving pages from the cache. + $conf['page_cache_without_database'] = TRUE; + $conf['page_cache_invoke_hooks'] = FALSE; + + $conf['memcache_servers'] = array('10.1.1.6:11211' => 'default', + '10.1.1.6:11212' => 'default', + '10.1.1.7:11211' => 'default', + '10.1.1.8:11211' => 'cluster2', + '10.1.1.9:11211' => 'cluster2'); + + $conf['memcache_bins'] = array('cache' => 'default', + 'cache_filter' => 'cluster2', + 'cache_menu' => 'cluster2'); + ); + +## PREFIXING ## + +If you want to have multiple Drupal installations share memcached instances, +you need to include a unique prefix for each Drupal installation in the $conf +array of settings.php. This can be a single string prefix, or a keyed array of +bin => prefix pairs: + + $conf['memcache_key_prefix'] = 'something_unique'; + +Using a per-bin prefix: + + $conf['memcache_key_prefix'] = array( + 'default' => 'something_unique', + 'cache_page' => 'something_else_unique' + ); + +In the above example, the 'something_unique' prefix will be used for all bins +except for the 'cache_page' bin which will use the 'something_else_unique' +prefix. Note that if using a keyed array for specifying prefix, you must specify +the 'default' prefix. + +It is also possible to specify multiple prefixes per bin. Only the first prefix +will be used when setting/getting cache items, but all prefixes will be cleared +when deleting cache items. This provides support for more complicated +configurations such as a live instance and an administrative instance each with +their own prefixes and therefore their own unique caches. Any time a cache item +is deleted on either instance, it gets flushed on both -- thus, should an admin +do something that flushes the page cache, it will appropriately get flushed on +both instances. (For more discussion see the issue where support was added, +https://www.drupal.org/node/1084448.) This feature is enabled when you configure +prefixes as arrays within arrays. For example: + + // Live instance. + $conf['memcache_key_prefix'] = array( + 'default' => array( + 'live_unique', // live cache prefix + 'admin_unique', // admin cache prefix + ), + ); + +The above would be the configuration of your live instance. Then, on your +administrative instance you would flip the keys: + + // Administrative instance. + $conf['memcache_key_prefix'] = array( + 'default' => array( + 'admin_unique', // admin cache prefix + 'live_unique', // live cache prefix + ), + ); + +## EXPERIMENTAL - ALTERNATIVE SERIALIZE ## + +This is a new experimental feature added to the memcache module in version +7.x-1.6 and should be tested carefully before utilizing in production. + +To optimize how data is serialized before it is written to memcache, you can +enable either the igbinary or msgpack PECL extension. Both switch from using +PHP's own human-readable serialized data strucutres to more compact binary +formats. + +No specicial configuration is required. If both extensions are enabled, +memcache will automatically use the igbinary extension. If only one extension +is enabled, memcache will automatically use that extension. + +You can optionally specify which extension is used by adding one of the +following to your settings.php: + + // Force memcache to use PHP's core serialize functions + $conf['memcache_serialize'] = 'serialize'; + + // Force memcache to use the igbinary serialize functions (if available) + $conf['memcache_serialize'] = 'igbinary'; + + // Force memcache to use the msgpack serialize functions (if available) + $conf['memcache_serialize'] = 'msgpack'; + +To review which serialize function is being used, enable the memcache_admin +module and visit admin/reports/memcache. + +IGBINARY: + +The igbinary project is maintained on GitHub: + - https://github.com/phadej/igbinary + +The official igbinary PECL extension can be found at: + - https://pecl.php.net/package/igbinary + +Version 2.0.1 or greater is recommended. + +MSGPACK: + +The msgpack project is maintained at: + - https://msgpack.org + +The official msgpack PECL extension can be found at: + - https://pecl.php.net/package/msgpack + +Version 2.0.2 or greater is recommended. + +## MAXIMUM LENGTHS ## + +If the length of your prefix + key + bin combine to be more than 250 characters, +they will be automatically hashed. Memcache only supports key lengths up to 250 +bytes. You can optionally configure the hashing algorithm used, however sha1 was +selected as the default because it performs quickly with minimal collisions. + +Visit http://www.php.net/manual/en/function.hash-algos.php to learn more about +which hash algorithms are available. + +$conf['memcache_key_hash_algorithm'] = 'sha1'; + +You can also tune the maximum key length BUT BE AWARE this doesn't affect +memcached's server-side limitations -- this value is primarily exposed to allow +you to further shrink the length of keys to optimize network performance. +Specifying a length larger than 250 will almost certainly lead to problems +unless you know what you're doing. + +$conf['memcache_key_max_length'] = 250; + +By default, the memcached server can store objects up to 1 MiB in size. It's +possible to increase the memcached page size to support larger objects, but this +can also lead to wasted memory. Alternatively, the Drupal memcache module splits +these large objects into smaller pieces. By default, the Drupal memcache module +splits objects into 1 MiB sized pieces. You can modify this with the following +tunable to match any special server configuration you may have. NOTE: Increasing +this value without making changes to your memcached server can result in +failures to cache large items. + +(Note: 1 MiB = 1024 x 1024 = 1048576.) + +$conf['memcache_data_max_length'] = 1048576; + +It is generally undesirable to store excessively large objects in memcache as +this can result in a performance penalty. Because of this, by default the Drupal +memcache module logs any time an object is cached that has to be split into +multiple pieces. If this is generating too many watchdog logs, you should first +understand why these objects are so large and if anything can be done to make +them smaller. If you determine that the large size is valid and is not causing +you any unnecessary performance penalty, you can tune the following variable to +minimize or disable this logging. Set the value to a positive integer to only +log when an object is split into this many or more pieces. For example, if +memcache_data_max_length is set to 1048576 and memcache_log_data_pieces is set +to 5, watchdog logs will only be written when an object is split into 5 or more +pieces (objects >4 MiB in size). Or, to to completely disable logging set +memcache_log_data_pieces to 0 or FALSE. + +$conf['memcache_log_data_pieces'] = 2; + +## MULTIPLE SERVERS ## + +To use this module with multiple memcached servers, it is important that you set +the hash strategy to consistent. This is controlled in the PHP extension, not +the Drupal module. + +If using PECL memcache: +Edit /etc/php.d/memcache.ini (path may changed based on package/distribution) +and set the following: +memcache.hash_strategy=consistent + +You need to reload apache httpd after making that change. + +If using PECL memcached: +Memcached options can be controlled in settings.php. The following setting is +needed: +$conf['memcache_options'] = array( + Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT, +); + +## DEBUG LOGGING ## + +You can optionally enable debug logging by adding the following to your +settings.php: + $conf['memcache_debug_log'] = '/path/to/file.log'; + +By default, only the following memcache actions are logged: 'set', 'add', +'delete', and 'flush'. If you'd like to also log 'get' and 'getMulti' actions, +enble verbose logging: + $conf['memcache_debug_verbose'] = TRUE; + +This file needs to be writable by the web server (and/or by drush) or you will +see lots of watchdog errors. You are responsible for ensuring that the debug log +doesn't get too large. By default, enabling debug logging will write logs +looking something like: + + 1484719570|add|semaphore|semaphore-memcache_system_list%3Acache_bootstrap|1 + 1484719570|set|cache_bootstrap|cache_bootstrap-system_list|1 + 1484719570|delete|semaphore|semaphore-memcache_system_list%3Acache_bootstrap|1 + +The default log format is pipe delineated, containing the following fields: + timestamp|action|bin|cid|return code + +You can specify a custom log format by setting the memcache_debug_log_format +variable. Supported variables that will be replaced in your format are: +'!timestamp', '!action', '!bin', '!cid', and '!rc'. +For example, the default log format (note that it includes a new line at the +end) is: + $conf['memcache_debug_log_format'] = "!timestamp|!action|!bin|!cid|!rc\n"; + +You can change the timestamp format by specifying a PHP date() format string in +the memcache_debug_time_format variable. PHP date() formats are documented at +http://php.net/manual/en/function.date.php. By default timestamps are written as +a unix timestamp. For example: + $conf['memcache_debug_time_format'] = 'U'; + +## TROUBLESHOOTING ## + +PROBLEM: + Error: + Failed to load required file memcache/dmemcache.inc + Or: + cache_backends not properly configured in settings.php, failed to load + required file memcache.inc + +SOLUTION: +You need to enable memcache in settings.php. Search for "Example 1" above +for a basic configuration example. + +PROBLEM: + Error: + PECL !extension version %version is unsupported. Please update to + %recommended or newer. + +SOLUTION: +Upgrade to the latest available PECL extension release. Older PECL extensions +have known bugs and cause a variety of problems when using the memcache module. + +PROBLEM: + Error: + Failed to connect to memcached server instance at . + +SOLUTION: +Verify that the memcached daemon is running at the specified IP and PORT. To +debug you can try to telnet directly to the memcache server from your web +servers, example: + telnet localhost 11211 + +PROBLEM: + Error: + Failed to store to then retrieve data from memcache. + +SOLUTION: +Carefully review your settings.php configuration against the above +documentation. This error simply does a cache_set followed by a cache_get +and confirms that what is written to the cache can then be read back again. +This test was added in the 7.x-1.1 release. + +The following code is what performs this test -- you can wrap this in a data) || $data->data !== $value) { + echo t('Failed to store to then retrieve data from memcache.'); + } + else { + // Test a delete as well. + cache_clear_all($cid, 'cache'); + } + +PROBLEM: + Error: + Unexpected failure when testing memcache configuration. + +SOLUTION: +Be sure the memcache module is properly installed, and that your settings.php +configuration is correct. This error means an exception was thrown when +attempting to write to and then read from memcache. + +PROBLEM: + Error: + Failed to set key: Failed to set key: cache_page-...... + +SOLUTION: +Upgrade your PECL library to PECL package (2.2.1) (or higher). + +WARNING: +Zlib compression at the php.ini level and Memcache conflict. +See http://drupal.org/node/273824 + +## MEMCACHE ADMIN ## + +A module offering a UI for memcache is included. It provides aggregated and +per-page statistics for memcache. + +## Memcached PECL Extension Support + +We also support the Memcached PECL extension. This extension backends +to libmemcached and allows you to use some of the newer advanced features in +memcached 1.4. + +NOTE: It is important to realize that the memcache php.ini options do not impact +the memcached extension, this new extension doesn't read in options that way. +Instead, it takes options directly from Drupal. Because of this, you must +configure memcached in settings.php. Please look here for possible options: + +http://us2.php.net/manual/en/memcached.constants.php + +An example configuration block is below, this block also illustrates our +default options (selected through performance testing). These options will be +set unless overridden in settings.php. + + $conf['memcache_options'] = array( + Memcached::OPT_COMPRESSION => FALSE, + Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT, + ); + +These are as follows: + + * Turn off compression, as this takes more CPU cycles than it's worth for most + users + * Turn on consistent distribution, which allows you to add/remove servers + easily + +Other options you could experiment with: + + Memcached::OPT_BINARY_PROTOCOL => TRUE, + * This enables the Memcache binary protocol (only available in Memcached + 1.4 and later). Note that some users have reported SLOWER performance + with this feature enabled. It should only be enabled on extremely high + traffic networks where memcache network traffic is a bottleneck. + Additional reading about the binary protocol: + http://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol + + + Memcached::OPT_TCP_NODELAY => TRUE, + * This enables the no-delay feature for connecting sockets; it's been + reported that this can speed up the Binary protocol (see above). This + tells the TCP stack to send packets immediately and without waiting for + a full payload, reducing per-packet network latency (disabling "Nagling"). + +It's possible to enable SASL authentication as documented here: + http://php.net/manual/en/memcached.setsaslauthdata.php + https://code.google.com/p/memcached/wiki/SASLHowto + +SASL authentication requires a memcached server with SASL support (version 1.4.3 +or greater built with --enable-sasl and started with the -S flag) and the PECL +memcached client version 2.0.0 or greater also built with SASL support. Once +these requirements are satisfied you can then enable SASL support in the Drupal +memcache module by enabling the binary protocol and setting +memcache_sasl_username and memcache_sasl_password in settings.php. For example: + + $conf['memcache_options'] = array( + Memcached::OPT_BINARY_PROTOCOL => TRUE, + ); + $conf['memcache_sasl_username'] = 'yourSASLUsername'; + $conf['memcache_sasl_password'] = 'yourSASLPassword'; + +## Amazon Elasticache + +You can use the Drupal Memcache module to talk with Amazon Elasticache, but to +enable Automatic Discovery you must use Amazon's forked version of the PECL +Memcached extension with Dynamic Client Mode enabled. + +Their PECL Memcached fork is maintained on GitHub: + - https://github.com/awslabs/aws-elasticache-cluster-client-memcached-for-php + +If you are using PHP 7 you need to select the php7 branch of their project. + +Once the extension is installed, you can enable Dynamic Client Mode as follows: + + $conf['memcache_options'] = array( + Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT, + Memcached::OPT_CLIENT_MODE => Memcached::DYNAMIC_CLIENT_MODE, + ); + +You then configure the module normally. Amazon explains: + "If you use Automatic Discovery, you can use the cluster's Configuration + Endpoint to configure your Memcached client." + +The Configuration Endpoint must have 'cfg' in the name or it won't work. Further +documentation can be found here: +http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/Endpoints.html + +If you don't want to use Automatic Discovery you don't need to install the +forked PECL extension, Amazon explains: + "If you don't use Automatic Discovery, you must configure your client to use + the individual node endpoints for reads and writes. You must also keep track + of them as you add and remove nodes." diff --git a/docroot/sites/all/modules/contrib/role_watchdog/README.txt b/docroot/sites/all/modules/contrib/role_watchdog/README.txt new file mode 100644 index 000000000..aecde175c --- /dev/null +++ b/docroot/sites/all/modules/contrib/role_watchdog/README.txt @@ -0,0 +1,61 @@ + +Description +--------------- +Role watchdog automatically logs all role changes made through the user profile +or the User List in its own table. A record of these changes is shown in a Role +history tab on each user's page. Role watchdog can optionally monitor one or +more specific roles for changes and notify members of selected roles via email +whenever a change occurs. + +This module might be useful when there are multiple administrators for a site, +and you need auditing or alerting of manual role changes. + + +Dependencies +--------------- +None. Database logging is a Core (optional) module. + +Tested compatible with: +* user edit (e.g. http://example.com/user/3/edit) +* user list (e.g. http://example.com/admin/user/user) +* Views Bulk Operations (VBO) 7.x-3.x-dev +* Role Delegation 7.x-1.0 + +Related Modules +--------------- +Role Delegation (http://drupal.org/project/role_delegation), +RoleAssign (http://drupal.org/project/roleassign), +Administer Users by Role (http://drupal.org/project/administerusersbyrole) + modules that enable user access to assign roles to other users where the + auditing of Role watchdog is a nice fit. + +Role Change Notify (http://drupal.org/project/role_change_notify) + the mirror functionality of Role watchdog, notifying the user when a role is + added to their account. + + +Usage +--------------- +Role watchdog will automatically start recording all role changes. No further +configuration is necessary for this functionality, the module will do this "out +of the box". A record of these changes is shown in a Role history tab on each +user's page and optionally in the Watchdog log if enabled. Users will need +either "View role history" or "View own role history" access permissions to +view the tab. + +Role watchdog can optionally email members of selected Notify roles when +selected Monitor roles are added or removed. This was specifically added to +keep a closer eye on certain role changes, such as an Administrator role. At +least one Monitor role and one Notify role must be selected for this +functionality. + + +Author +--------------- +John Money +ossemble LLC. +http://ossemble.com + +Module development originally sponsored by LifeWire, a service of About.com, a +part of The New York Times Company. +http://www.lifewire.com diff --git a/docroot/sites/all/modules/contrib/search_api_acquia/README.txt b/docroot/sites/all/modules/contrib/search_api_acquia/README.txt new file mode 100644 index 000000000..416b555d4 --- /dev/null +++ b/docroot/sites/all/modules/contrib/search_api_acquia/README.txt @@ -0,0 +1,44 @@ +Search API Acquia module +========================= + +This module provides integration between your Drupal site and Acquia's +hosted search service. It requires the Acquia Connector module, a valid Acquia +subscription, and Search API Solr module. + + +Installation +-------------------------------------------------------------------------------- + +Consult the online documentation at https://docs.acquia.com/network/install for +installation instructions. + +Notes on Acquia Search data protection and index auto-switching +-------------------------------------------------------------------------------- + +Search API Acquia module attempts to auto-detect your environment and automatically +connect to the best-fit Acquia Search index available. This is done to attempt +to protect your data in your production Solr instance; otherwise a development +site could easily overwrite or delete the data in your production index. + +This functionality was previously available as a third-party module +https://www.drupal.org/project/acquia_search_multi_subs which will now become +deprecated. + +Depending on the indexes already provisioned on your Acquia Subscription, the +module will follow these rules to connect to the proper index: + +* If your site is running within Acquia Cloud, Search API Acquia will connect to + the index name that matches the current environment (dev/stage/prod) and + current multi-site instance. +* If the module can't find an appropriate index above, it will then enforce + READ-ONLY mode on the production Solr index. This allows you to still test + searching from any site while protecting your production, user-facing index. + +The current state is noted on the Drupal UI's general status report at +/admin/reports/status, as well as when attempting to edit each connection. + +You can override this behavior using code snippets or a Drupal variable. This, +however, poses risks to your data that you should be aware of. Please consult +our documentation at https://docs.acquia.com/acquia-search/multiple-cores to +find out more. + diff --git a/docroot/sites/all/modules/contrib/search_api_solr/CHANGELOG.txt b/docroot/sites/all/modules/contrib/search_api_solr/CHANGELOG.txt new file mode 100644 index 000000000..68fe9882f --- /dev/null +++ b/docroot/sites/all/modules/contrib/search_api_solr/CHANGELOG.txt @@ -0,0 +1,286 @@ +Search API Solr Search 1.12 (2017-02-23): +----------------------------------------- +- #2612770 by Temoor, drunken monkey: Fixed conjunction in complex filter + conditions. +- #2711685 by berliner: Added support for Solr 6. +- #2842661 by gabrielu, drunken monkey: Fixed duplicate code line in + clearCache(). +- #2834159 by zniki.ru: Fixed left-over explicit + SearchApiSolrConnection::escapeFieldName() call. +- #2677912 by jts86, mian3010: Added option to disable committing for Solr. +- #2828473 by detroz: Fixed incorrect variable initialization. +- #2826565 by Sardis, drunken monkey: Fixed multi-valued field highlighting. +- #2807327 by drunken monkey: Fixed configuration form descriptions. +- #2772199 by drunken monkey: Added a warning to the description for the + highlighting server option. +- #2733625 by joelstein, drunken monkey: Fixed notice in + Connection::getFields(). + +Search API Solr Search 1.11 (2016-07-06): +----------------------------------------- +- #2710397 by drunken monkey: Fixed escaping of highlighting tags. +- #2636016 by drunken monkey: Fixed location search distance facets. + +Search API Solr Search 1.10 (2016-03-14): +----------------------------------------- +- #2604322 by lex0r, drunken monkey: Added the option to log all Solr queries. +- #2645366 by tedfordgif, drunken monkey: Fixed browser incorrectly filling the + HTTP Auth form fields. +- #2611716 by aditya_anurag, drunken monkey: Improved the method documentation + comments. +- #2599658 by Loparev, drunken monkey: Added the possibility to highlight + non-fulltext fields. +- #2598288 by ethan.han777, JeroenT, drunken monkey: Fixed potential notices in + the spellchecker code. +- #2564927 by thePanz: Added support for random sorting in grouped searches. +- #2527528 by maximpodorov, drunken monkey: Fixed searching of string fields + with leading/trailing spaces. +- #2513314 by fortis, drunken monkey: Fixed error for empty filters. +- #2551763 by drunken monkey: Fixed mention of INSTALL.txt in an error message. + +Search API Solr Search 1.9 (2015-08-30): +---------------------------------------- +- #2503829 by das-peter: Added support for grouping on "magic" fields. +- #2503617 by tobiasb: Fixed undefined "status_message" property in HTTP + response object. +- #2313591 by thePanz, nadavoid: Added support for random sorting. +- #2004596 by drunken monkey: Fixed workarounds for MLT problems. +- #2486533 by drunken monkey: Fixed the default operator in the Solr 5 configs. +- #2466897 by drunken monkey: Fixed Solr version options in server settings. +- #1918904 by arnested, ramlev, drunken monkey: Added an alter hook for + autocomplete suggestions. +- #2532812 by drunken monkey: Improved performance for filter-only queries. +- #2463523 by bmunslow: Fixed field boosts in multi-index searches. + +Search API Solr Search 1.8 (2015-06-15): +---------------------------------------- +- #2502511 by drunken monkey: Fixed index removal on Solr 5. +- #2441117 by drunken monkey: Fixed unnecessary reindexing after changing + fields' boosts. + +Search API Solr Search 1.7 (2015-06-08): +---------------------------------------- +- #2466489 by drunken monkey: Changed installation instructions to point to the + handbook. +- #2486533 by drunken monkey: Fixed default operator in Solr 5. +- #2456159 by drunken monkey: Updated config files to their latest version from + the common configs. +- #2442077 by drunken monkey, basvredeling: Added support for Solr 5. +- #2451037 by drunken monkey: Fixed timeout errors during indexing. +- #2054551 by paolomainardi, drunken monkey, lex0r: Added possibility to + retrieve Solr field values in multi-index searches. +- #1908990 by drunken monkey: Fixed various issues with excerpts. +- #2368399 by das-peter, drunken monkey: Added Support for location filtering + with a bounding box. +- #2333133 by drunken monkey: Fixed behavior of filters on fulltext fields. + +Search API Solr Search 1.6 (2014-09-08): +---------------------------------------- +- #2050961 by das-peter, drunken monkey: Added proximity/distance information + to search results. +- #2242073 by RaF: Fixed handling of custom negative filters in filter-only + searches. +- #2290601 by drunken monkey: Fixed handling of complex keywords and OR facets. +- #2083357 by drunken monkey: Added note that Solr 4.x server paths should be + specified with core. +- #2270767 by RaF: Fixed search_api_solr_views_data_alter() not always + returning all virtual fields. + +Search API Solr Search 1.5 (2014-05-23): +---------------------------------------- +- #2216895 by das-peter: Added support for empty/non-empty conditions on + location field types. +- #2162627 by drunken monkey: Removed Solr 1.4 support. +- #2175829 by danquah, drunken monkey: Fixed error when admin interface is not + accessible. +- #2222037 by drunken monkey: Fixed "Files" tab in Solr 4.7. +- #2151719 by Derimagia, drunken monkey: Added an alter hook for multi-index + search results. +- #1776534 by drunken monkey, e2thex: Added support for using a Solr server + with multiple sites. +- #2152337 by drunken monkey: Removed confusing "multiple text fields" section + from README.txt. +- #2099559 by drunken monkey: Made optimizing the Solr server optional. +- #2146749 by drunken monkey: Added soft commits as the default for Solr 4. +- #1773440 by drunken monkey: Added performance improvement for “filter + only” queries. +- #2147573 by drunken monkey: Improved error handling. + +Search API Solr Search 1.4 (2013-12-25): +---------------------------------------- +- #2157839 by drunken monkey, Nick_vh: Updated config files to the newest + version. +- #2130827 by drunken monkey: Added additional Solr server information to the + Server overview. +- #2126281 by drunken monkey: Update error handling according to the latest + Search API change. +- #2127991 by drunken monkey: Fixed handling of negated fulltext keys. +- #2113943 by drunken monkey: Fixed clash in specifying the HTTP method for + searches. +- #2127193 by jlapp: Fixed date field values returned for multi-index searches. +- #2122155 drunken monkey: Added the "Files" tab to contextual links. +- #1846860 by andrewbelcher, drclaw, drunken monkey, danielnolde: Added a way + to easily define new dynamic field types. +- #2064377 by Nick_vh: Made configuration files compatible with Solr Cloud. +- #2107417 by Nick_vh: Fixed config files for Solr 4.5. + +Search API Solr Search 1.3 (2013-10-23): +---------------------------------------- +- #2099683 by drunken monkey: Added support for 'virtual fields' in Views. +- #1997702 by ianthomas_uk, drunken monkey: Added "AUTO" mode for HTTP method. +- #2033913 by drunken monkey: Fixed small error in schema.xml. +- #2073441 by drunken monkey: Removed custom uninstall code for deleting + dependent servers. +- #1882190 by corvus_ch, arnested, drunken monkey: Added optional index ID + prefixes. + +Search API Solr Search 1.2 (2013-09-01): +---------------------------------------- +- #1246730 by febbraro, maciej.zgadzaj, drunken monkey: Added a way to alter + the Solr document when indexing. +- #2053553 by drunken monkey, andrewbelcher: Fixed spatial features with clean + field identifiers. +- #2054373 by drunken monkey: Added the option to use clean field identifiers. +- #1992806 by drunken monkey: Documented problems with Solr 4.3+. +- #2045355 by drunken monkey, arpieb: Fixed result mapping of item IDs. +- #2050157 by izus: Fixed typo in stopwords.txt. + +Search API Solr Search 1.1 (2013-07-21): +---------------------------------------- +- #1957730 by drunken monkey: Fixed filter query strings for negated filters. +- #2010818 by kenorb, drunken monkey: Added new Files tab showing all used solr + config files. +- #2042201 by klausi: Fixed timeouts while optimizing Solr server. +- #2034719 by fago: Added raw term to autocompletion response. +- #2027843 by fago, drunken monkey: Made the Solr response available as part of + the search results. +- #1834614 by drunken monkey: Fixed date fields in MLT queries. +- #1970652 by jsteggink: Fixed highlighting for text fields. +- #2016169 by tomdearden, drunken monkey: Fixed parsing of facets on + multi-valued fields. +- #2008034 by bdecarne: Fixed highlighting in multi-index searches. + +Search API Solr Search 1.0 (2013-06-09): +---------------------------------------- +- #1896080 by drunken monkey: Included additional required config files in the + module. +- #1919572 by chaby: Fixed indexing of geohashes. +- #2004596 by drunken monkey: Fixed "More Like This" for Solr 4.x. +- #2007214 by drunken monkey: Fixed unsetting of object properties. +- #1884312 by drunken monkey, mvc: Fixed resetting of HTTP password upon + re-saving of the configuration form. +- #1957774 by drunken monkey: Fixed displayed link to local Solr servers. +- #1721262 by Steven Jones, das-peter, drunken monkey: Added field collapsing + support. +- #1549244 by cferthorney, drunken monkey: Added SSL Support for Solr servers. + +Search API Solr Search 1.0, RC 5 (2013-05-17): +---------------------------------------------- +- #1190462 by drunken monkey: Documented that enabling HTML filter makes sense. +- #1986284 by drunken monkey: Updated common configs to the latest version. +- #1990422 by populist, drunken monkey: Added support for custom stream contexts + for HTTP requests. +- #1957890 by drunken monkey, jwilson3: Fixed several bugs for facets. +- #1676224 by dasjo, morningtime, drunken monkey: Added support for Solr 4.x. +- #1985522 by chaby: Fixed use of instance method in static escape() method. +- #1979102 by drunken monkey: Fixed wrong limit for limit-less searches. +- #1978632 by chaby, drunken monkey: Fixed wrong check on softCommit. +- #1978600 by chaby: Fixed hook_requirements() for install phase. +- #1976930 by drunken monkey: Fixed duplicate method in SearchApiSolrField. + +Search API Solr Search 1.0, RC 4 (2013-04-22): +---------------------------------------------- +- #1744250 by mollux, drunken monkey, das-peter: Added support for + location-based searches. +- #1846254 by drunken monkey: Removed the SolrPhpClient dependency. +- #1934450 by jwilson3, jlapp: Fixed reference to removed method + getFacetField(). +- #1900644 by Deciphered: Fixed facet handling for multi-index searches. +- #1897386 by drunken monkey, NIck_vh: Update the common schema. + +Search API Solr Search 1.0, RC 3 (2013-01-06): +---------------------------------------------- +- #1828260 by drunken monkey: Fixed filtering by index in multi-index searches. +- #1509380 by drunken monkey: Adopt common config files. +- #1815348 by drunken monkey: Fixed queryMultiple() to not use item ID as the + array key. +- #1789204 by Steven Jones: Added way to easily alter the fl parameter. +- #1744250 by mollux, dasjo: Added support for location based search. +- #1813670 by guillaumev: Fixed check for autocomplete configuration in form. +- #1425910 by drunken monkey, mh86: Added setting for maximum occurence + threshold in autocomplete. +- #1691132 by drunken monkey, David Stosik: Fixed calls to watchdog(). +- #1588130 by regilero, David Stosik, drunken monkey: Fixed error handling. +- #1805720 by drunken monkey: Added additional options and improvements for the + autocomplete functionality. +- #1276970 by derhasi, moonray: Fixed large queries break Solr search. +- #1299940 by drunken monkey: Fixed handling of empty response. +- #1507818 by larowlan: Fixed field boosts for standard request handler. + +Search API Solr Search 1.0, RC 2 (2012-05-23): +---------------------------------------------- +- Fixed escaping of error messages. +- #1480170 by kotnik: Fixed return value of hook_requirements(). +- #1500210 by ezra-g, acrollet, jsacksick: Fixed errors when installing with + non-default installation profiles. +- #1444432 by Damien Tournoud, jsacksick: Added field-level boosting. +- #1302406 by Steven Jones: Fixed autoload problem during installation. +- #1340244 by drunken monkey, alanomaly: Added more helpful error messages. + +Search API Solr Search 1.0, RC 1 (2011-11-10): +---------------------------------------------- +- #1308638 by drunken monkey: Adapted to new structure of field settings. +- #1308498 by zenlan, drunken monkey: Added flexibility for facet fields. +- #1319544 by drunken monkey: Fixed never delete contents of read-only indexes. +- #1309650 by jonhattan, drunken monkey: Added support for the Libraries API. + +Search API Solr Search 1.0, Beta 4 (2011-09-08): +------------------------------------------------ +- #1230536 by thegreat, drunken monkey: Added support for OR facets. +- #1184002 by drunken monkey: Fixed support of the latest SolrPhpClient version. +- #1032848 by das-peter, drunken monkey: Added possibility to save SolrPhpClient + to the libraries directory. +- #1225926 by drunken monkey, fago: Fixed performance problems in indexing + workflow. +- #1219310 by drunken monkey: Adapted to recent API change. +- #1203680 by klausi: Fixed use of taxonomy terms for "More like this". +- #1181260 by klausi: Fixed mlt.maxwl in solrconfig.xml. +- #1116896 by drunken monkey: Adapted to newer Solr versions. +- #1190462 by drunken monkey: Added option to directly highlight retrieved data + from Solr. +- #1196514 by drunken monkey, klausi: Fixed case sensitivity of input keys for + autocomplete. +- #1192654 by drunken monkey: Added support for the Autocomplete module. +- #1177648 by drunken monkey: Added option to use Solr's built-in highlighting. +- #1154116 by drunken monkey: Added option for retrieving search results data + directly from Solr. +- #1184002 by drunken monkey: Fixed INSTALL.txt to reflect that the module + doesn't work with the latest Solr PHP Client version. + +Search API Solr Search 1.0, Beta 3 (2011-06-06): +------------------------------------------------ +- #1111852 by miiimooo, drunken monkey: Added a 'More like this' feature. +- #1153306 by JoeMcGuire, drunken monkey: Added spellchecking support. +- #1138230 by becw, drunken monkey: Added increased flexibility to the service + class. +- #1127038 by drunken monkey: Fixed handling of date facets. +- #1110820 by becw, drunken monkey: Added support for the Luke request handler. +- #1095956 by drunken monkey: Added Solr-specific index alter hook. + +Search API Solr Search 1.0, Beta 2 (2011-03-04): +------------------------------------------------ +- #1071894 by drunken monkey: Fixed incorrect handling of boolean facets. +- #1071796: Add additional help for Solr-specific extensions. +- #1056018: Better document Solr config customization options. +- #1049900: Field values are sometimes not escaped properly. +- #1043586: Allow Solr server URL to be altered. +- #1010610 by mikejoconnor: Fix hook_requirements(). +- #1024146: Don't use file_get_contents() for contacting the Solr server. +- #1010610: More helpful error message when SolrPhpClient is missing. +- #915174: Remove unnecessary files[] declarations from .info file. +- #984134: Add Solr-specific query alter hooks. + +Search API Solr Search 1.0, Beta 1 (2010-11-29): +------------------------------------------------ +Basic functionality is in place and quite well-tested, including support for +facets and for multi-index searches. diff --git a/docroot/sites/all/modules/contrib/search_api_solr/README.txt b/docroot/sites/all/modules/contrib/search_api_solr/README.txt new file mode 100644 index 000000000..543a9bd53 --- /dev/null +++ b/docroot/sites/all/modules/contrib/search_api_solr/README.txt @@ -0,0 +1,169 @@ +Solr search +----------- + +This module provides an implementation of the Search API which uses an Apache +Solr search server for indexing and searching. You can find detailed +instructions for setting up Solr in the module's handbook [1]. + +[1] https://www.drupal.org/node/1999280 + +Supported optional features +--------------------------- + +All Search API datatypes are supported by using appropriate Solr datatypes for +indexing them. By default, "String"/"URI" and "Integer"/"Duration" are defined +equivalently. However, through manual configuration of the used schema.xml this +can be changed arbitrarily. Using your own Solr extensions is thereby also +possible. + +The "direct" parse mode for queries will result in the keys being directly used +as the query to Solr. For details about Lucene's query syntax, see [2]. There +are also some Solr additions to this, listed at [3]. Note however that, by +default, this module uses the dismax query handler, so searches like +"field:value" won't work with the "direct" mode. + +[2] http://lucene.apache.org/java/2_9_1/queryparsersyntax.html +[3] http://wiki.apache.org/solr/SolrQuerySyntax + +Regarding third-party features, the following are supported: + +- search_api_autocomplete + Introduced by module: search_api_autocomplete + Lets you add autocompletion capabilities to search forms on the site. (See + also "Hidden variables" below for Solr-specific customization.) +- search_api_facets + Introduced by module: search_api_facetapi + Allows you to create facetted searches for dynamically filtering search + results. +- search_api_facets_operator_or + Introduced by module: search_api_facetapi + Allows the creation of OR facets. +- search_api_mlt + Introduced by module: search_api_views + Lets you display items that are similar to a given one. Use, e.g., to create + a "More like this" block for node pages. + NOTE: Due to a regression in Solr itself, "More like this" doesn't work with + integer and float fields in Solr 4. As a work-around, you can index the fields + (or copies of them) as string values. See [4] for details. + Also, MLT with date fields isn't currently supported at all for any version. +- search_api_multi + Introduced by module: search_api_multi + Allows you to search multiple indexes at once, as long as they are on the same + server. You can use this to let users simultaneously search all content on the + site – nodes, comments, user profiles, etc. +- search_api_spellcheck + Introduced by module: search_api_spellcheck + Gives the option to display automatic spellchecking for searches. +- search_api_data_type_location + Introduced by module: search_api_location + Lets you index, filter and sort on location fields. Note, however, that only + single-valued fields are currently supported for Solr 3.x. +- search_api_grouping + Introduced by module: search_api_grouping [5] + Lets you group search results based on indexed fields. For further information + see the FieldCollapsing documentation in the solr wiki [6]. + +If you feel some service option is missing, or have other ideas for improving +this implementation, please file a feature request in the project's issue queue, +at [7]. + +[4] https://drupal.org/node/2004596 +[5] https://drupal.org/sandbox/daspeter/1783280 +[6] http://wiki.apache.org/solr/FieldCollapsing +[7] https://drupal.org/project/issues/search_api_solr + +Specifics +--------- + +Please consider that, since Solr handles tokenizing, stemming and other +preprocessing tasks, activating any preprocessors in a search index' settings is +usually not needed or even cumbersome. If you are adding an index to a Solr +server you should therefore then disable all processors which handle such +classic preprocessing tasks. Enabling the HTML filter can be useful, though, as +the default config files included in this module don't handle stripping out HTML +tags. + +Clean field identifiers: + If your Solr server was created in a module version prior to 1.2, you will get + the option to switch the server to "Clean field identifiers" (which is default + for all new servers). This will change the Solr field names used for all + fields whose Search API identifiers contain a colon (i.e., all nested fields) + to support some advanced functionality, like sorting by distance, for which + Solr is buggy when using field names with colons. + The only downside of this change is that the data in Solr for these fields + will become invalid, so all indexes on the server which contain such fields + will be scheduled for re-indexing. (If you don't want to search on incomplete + data until the re-indexing is finished, you can additionally manually clear + the indexes, on their Status tabs, to prevent this.) + +Hidden variables +---------------- + +- search_api_solr_autocomplete_max_occurrences (default: 0.9) + By default, keywords that occur in more than 90% of results are ignored for + autocomplete suggestions. This setting lets you modify that behaviour by + providing your own ratio. Use 1 or greater to use all suggestions. +- search_api_solr_index_prefix (default: '') + By default, the index ID in the Solr server is the same as the index's machine + name in Drupal. This setting will let you specify a prefix for the index IDs + on this Drupal installation. Only use alphanumeric characters and underscores. + Since changing the prefix makes the currently indexed data inaccessible, you + should change this vairable only when no indexes are currently on any Solr + servers. +- search_api_solr_index_prefix_INDEX_ID (default: '') + Same as above, but a per-index prefix. Use the index's machine name as + INDEX_ID in the variable name. Per-index prefixing is done before the global + prefix is added, so the global prefix will come first in the final name: + (GLOBAL_PREFIX)(INDEX_PREFIX)(INDEX_ID) + The same rules as above apply for setting the prefix. +- search_api_solr_http_get_max_length (default: 4000) + The maximum number of bytes that can be handled as an HTTP GET query when + HTTP method is AUTO. Typically Solr can handle up to 65355 bytes, but Tomcat + and Jetty will error at slightly less than 4096 bytes. +- search_api_solr_cron_action (default: "spellcheck") + The Search API Solr Search module can automatically execute some upkeep + operations daily during cron runs. This variable determines what particular + operation is carried out. + - spellcheck: The "default" spellcheck dictionary used by Solr will be rebuilt + so that spellchecking reflects the latest index state. + - optimize: An "optimize" operation [8] is executed on the Solr server. As a + result of this, all spellcheck dictionaries (that have "buildOnOptimize" set + to "true") will be rebuilt, too. + - none: No action is executed. + If an unknown setting is encountered, it is interpreted as "none". +- search_api_solr_site_hash (default: random) + A unique hash specific to the local site, created the first time it is needed. + Only change this if you want to display another server's results and you know + what you are doing. Old indexed items will be lost when the hash is changed + and all items will have to be reindexed. Can only contain alphanumeric + characters. +- search_api_solr_highlight_prefix (default: "tm_") + The prefix of Solr fields for which field-level highlighting will be enabled. + Since the prefix of fields is used to determine the field type (by default), + this lets you enable highlighting for other field types. By default, + highlighting will be possible for all fulltext fields. + +[8] http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22 + +Customizing your Solr server +---------------------------- + +The schema.xml and solrconfig.xml files contain extensive comments on how to +add additional features or modify behaviour, e.g., for adding a language- +specific stemmer or a stopword list. +If you are interested in further customizing your Solr server to your needs, +see the Solr wiki at [9] for documentation. When editing the schema.xml and +solrconfig.xml files, please only edit the copies in the Solr configuration +directory, not directly the ones provided with this module. + +[9] http://wiki.apache.org/solr/ + +You'll have to restart your Solr server after making such changes, for them to +take effect. + +Developers +---------- + +The SearchApiSolrService class has a few custom extensions, documented with its +code. Methods of note are deleteItems(), which treats the first argument +differently in certain cases, and the methods at the end of service.inc. diff --git a/docroot/sites/all/modules/contrib/seckit/CHANGELOG.txt b/docroot/sites/all/modules/contrib/seckit/CHANGELOG.txt new file mode 100644 index 000000000..3a8343f88 --- /dev/null +++ b/docroot/sites/all/modules/contrib/seckit/CHANGELOG.txt @@ -0,0 +1,43 @@ +SecKit 1.7 +------------- +#2091627: CSP report-uri directive is relative (Thanks @jweowu) +#1909846: Undefined index in _seckit_csp_report() (Thanks @jweowu) + +SecKit 1.6 +------------- +#2043283: X-XSS-Protection is disabled by default + +SecKit 1.5 +------------- +#1893038: Support Allow-From in X-Frame-Options +#1809020: Prevent Origin check for localhost +#1890738: Revert to default CSP options if directives are empty + +SecKit 1.4 +------------- +#1777704: Conflicts with D7 overlay +#1765080: Typo in seckit description +#1359292: First official CSP draft +#1302576: Media Browser is not load when security kit is enabled + +SecKit 1.3 +------------- +#1298742: Added option for setting custom noscript message +#1243032: Override style for frames option is removed +#1241226: Updated CSP to the new specification + +SecKit 1.2 +------------- +#1242628: Implemented X-Content-Type-Options HTTP response header +#1227544: Implemented From-Origin HTTP response header +#1241224: When CSP policy-uri is filled, all directives greyes out +#1241888: CSP default-src is no longer required + +SecKit 1.1 +------------- +#1124380: Updated CSP to the new specification +#1188984: Added Google Chrome CSP support + +SecKit 1.0 +------------- +Initial release. Supports Drupal 7.x diff --git a/docroot/sites/all/modules/contrib/seckit/README.md b/docroot/sites/all/modules/contrib/seckit/README.md new file mode 100644 index 000000000..73ab1daa1 --- /dev/null +++ b/docroot/sites/all/modules/contrib/seckit/README.md @@ -0,0 +1,29 @@ +# Description + +Security Kit (SecKit) provides with various options to improve security of web application. +Currently, modern browsers support a lot of techniques to mitigate common web vulnerabilites +like XSS, CSRF, Clickjacking. However, these techniques requires server-side implementation. +Thus, SecKit provides websites with easy and flexible way to implement them. +Additionally, module has options to fix HTML injection issue, +which can be exploited via Drupal 6.x core Upload module. + +# Installation + +1. Extract archive with module to contributed modules directory. +2. Enable it on Modules page. +3. Settings of module are available on http://www.example.com/admin/config/system/seckit + +# Features + +More information about features can be found on project page +http://drupal.org/project/seckit + +# Issues + +If you experience any problems with SecKit, please, +report issues on http://drupal.org/project/issues/seckit + +# Author + +Alex Rodionov +https://github.com/p0deje/seckit diff --git a/docroot/sites/all/modules/contrib/securepages/README.txt b/docroot/sites/all/modules/contrib/securepages/README.txt new file mode 100644 index 000000000..4b30dad7a --- /dev/null +++ b/docroot/sites/all/modules/contrib/securepages/README.txt @@ -0,0 +1,24 @@ + +Configuration +------------------------------------------------------------------------------ + +Generally on test/development servers you do not have access to SSL, so +generally you would like to disable secure pages on these systems. + +To do this add the following to your settings.php + +$conf['securepages_enable'] = 0; + +Removal of SecurePages +------------------------------------------------------------------------------ + +In the case where your SSL mode has been disabled and you can no longer access +the administration section of your site to disable securepages you can do one +of the 2 following things. + + 1. Use the above method to disable securepages. + 2. delete the secure pages module from your site. + +If you can use the first option but if you can't edit your settings.php then +deleting it will not break your site, but will leave some variables that are +set by secure pages. \ No newline at end of file diff --git a/docroot/sites/all/modules/contrib/shield/README.txt b/docroot/sites/all/modules/contrib/shield/README.txt new file mode 100644 index 000000000..9af10690c --- /dev/null +++ b/docroot/sites/all/modules/contrib/shield/README.txt @@ -0,0 +1,36 @@ +Description +----------- +This module creates a simple shield for your site with Apache authentication. When configured, users will be prompted for a simple username/password combination. + +Requirements +------------ +Drupal 7.x + +Installation +------------ +1. Copy the entire shield directory to your contributed modules directory. + +2. Log in as an administrator. Enable the module at admin/modules. + +Configuration +------------- +1. Configure which roles have permission to administer the Shield module at admin/people/permissions. + +2. Visit admin/config/system/shield to enable authentication. + +3a. Complete the user and password fields in the 'credentials' section of the Shield configuration page. When the user field is left empty, authentication will be disabled. + +3b. Alternatively, the user (e.g. 'FOO') and password (e.g. 'BAR') values can be configured via settings.php's $conf array: +$conf['shield_user'] = 'FOO'; +$conf['shield_pass'] = 'BAR'; + +3c. Alternatively, the user (e.g. 'FOO') and password (e.g. 'BAR') values can be configured via drush: +drush vset shield_user FOO +drush vset shield_user BAR +# To disable: +drush vdel shield_user + +Support +------- +Please use the issue queue for filing bugs with this module at +https://www.drupal.org/project/issues/shield diff --git a/docroot/sites/all/modules/contrib/stage_file_proxy/INSTALL.txt b/docroot/sites/all/modules/contrib/stage_file_proxy/INSTALL.txt new file mode 100644 index 000000000..7ee87bed8 --- /dev/null +++ b/docroot/sites/all/modules/contrib/stage_file_proxy/INSTALL.txt @@ -0,0 +1,81 @@ +STEPS TO INSTALL: +========= +1. Enable the module. + +2. Add variables to $conf in settings.php: + +REQUIRED: +========= + +The origin website. + +$conf['stage_file_proxy_origin'] = 'http://example.com'; // no trailing slash + +If the site is using HTTP Basic Authentication (the browser popup for username +and password) you can embed those in the url. Be sure to URL encode any +special characters: + +For example, setting a user name of "myusername" and password as, "letme&in" the +configuration would be the following: + +$conf['stage_file_proxy_origin'] = 'http://myusername:letme%26in@example.com'; + +OPTIONAL +======== +$conf['stage_file_proxy_use_imagecache_root'] = TRUE; + +Default is TRUE. + +If this is true (default) then Stage File Proxy will look for /imagecache/ in +the URL and determine the original file and request that rather than the +processed file, then send a header to the browser to refresh the image and let +imagecache handle it. This will speed up future imagecache requests for the +same original file. + +$conf['stage_file_proxy_hotlink'] = FALSE; + +Default is FALSE. + +If this is true then Stage File Proxy will not transfer the remote file to the +local machine, it will just serve a 301 to the remote file and let the origin +webserver handle it. + +$conf['stage_file_proxy_origin_dir'] = 'sites/default/files'; + +Default is 'sites/default/files'; + +If this is set then Stage File Proxy will use a different path for the remote +files. This is useful for multisite installations where the sites directory +contains different names for each url. If this is not set, it defaults to the +same path as the local site (sites/default/files). + +$conf['stage_file_proxy_sslversion'] = 3; + +Default is 3. + +CURL will try to figure out which ssl version to use, but if it fails to do that +properly it can lead to getting an empty file and a 0 status code. The default +is 3 which seems relatively common, but if you get 0 byte files you can try +changing it to 2. + +DRUSH USERS +=========== + +To automatically enable stage_file_proxy on your dev machine after sql-sync, +add the following to your dev site alias file: + + $aliases['dev'] = array ( + 'root' => '/path/to/drupalroot', + 'uri' => 'http://example.org', + 'target-command-specific' => array( + 'sql-sync' => array( + 'enable' => array('stage_file_proxy'), + ), + ), + ); + +In order for this to work, you must copy the file +drush/examples/sync_enable.drush.inc to your ~/.drush folder. +For more information, see: + +http://drupalcode.org/project/drush.git/blob/HEAD:/examples/sync_enable.drush.inc diff --git a/docroot/sites/all/modules/contrib/visualization_entity_maps/README.md b/docroot/sites/all/modules/contrib/visualization_entity_maps/README.md new file mode 100644 index 000000000..12697e9e0 --- /dev/null +++ b/docroot/sites/all/modules/contrib/visualization_entity_maps/README.md @@ -0,0 +1,7 @@ +# Visualization Entity Charts + +This module provides embeddable maps based on Visualization Entity module. + +## Installation + + * Make sure you have [visualization_entity](https://github.com/NuCivic/visualization_entity) module already installed and enabled. diff --git a/docroot/sites/all/modules/contrib/visualization_entity_tables/README.md b/docroot/sites/all/modules/contrib/visualization_entity_tables/README.md new file mode 100644 index 000000000..35ee47aff --- /dev/null +++ b/docroot/sites/all/modules/contrib/visualization_entity_tables/README.md @@ -0,0 +1,7 @@ +# Visualization Entity Tables + +This module provides embeddable maps based on Visualization Entity module. + +## Installation + + * Make sure you have [visualization_entity](https://github.com/NuCivic/visualization_entity) module already installed and enabled. diff --git a/docroot/sites/all/themes/README.txt b/docroot/sites/all/themes/README.txt new file mode 100644 index 000000000..54f9cdc8a --- /dev/null +++ b/docroot/sites/all/themes/README.txt @@ -0,0 +1,29 @@ +Themes allow you to change the look and feel of your Drupal site. You can use +themes contributed by others or create your own. + +WHAT TO PLACE IN THIS DIRECTORY? +-------------------------------- + +Placing downloaded and custom themes in this directory separates downloaded and +custom themes from Drupal core's themes. This allows Drupal core to be updated +without overwriting these files. + +DOWNLOAD ADDITIONAL THEMES +-------------------------- + +Contributed themes from the Drupal community may be downloaded at +https://www.drupal.org/project/project_theme. + +MULTISITE CONFIGURATION +----------------------- + +In multisite configurations, themes found in this directory are available to +all sites. Alternatively, the sites/your_site_name/themes directory pattern +may be used to restrict themes to a specific site instance. + +MORE INFORMATION +----------------- + +Refer to the "Appearance" section of the README.txt in the Drupal root directory +for further information on customizing the appearance of Drupal with custom +themes. diff --git a/docroot/themes/README.txt b/docroot/themes/README.txt new file mode 100644 index 000000000..3fb27ed10 --- /dev/null +++ b/docroot/themes/README.txt @@ -0,0 +1,9 @@ + +This directory is reserved for core theme files. Custom or contributed themes +should be placed in their own subdirectory of the sites/all/themes directory. +For multisite installations, they can also be placed in a subdirectory under +/sites/{sitename}/themes/, where {sitename} is the name of your site (e.g., +www.example.com). This will allow you to more easily update Drupal core files. + +For more details, see: http://drupal.org/node/176043 + diff --git a/docroot/themes/bartik/bartik.info b/docroot/themes/bartik/bartik.info index 76336801d..a49c03e60 100644 --- a/docroot/themes/bartik/bartik.info +++ b/docroot/themes/bartik/bartik.info @@ -34,8 +34,7 @@ regions[footer] = Footer settings[shortcut_module_link] = 0 -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/themes/garland/garland.info b/docroot/themes/garland/garland.info index 3a81d19fd..b211949df 100644 --- a/docroot/themes/garland/garland.info +++ b/docroot/themes/garland/garland.info @@ -7,8 +7,7 @@ stylesheets[all][] = style.css stylesheets[print][] = print.css settings[garland_width] = fluid -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/themes/seven/seven.info b/docroot/themes/seven/seven.info index ce455f5a7..8b1eb067d 100644 --- a/docroot/themes/seven/seven.info +++ b/docroot/themes/seven/seven.info @@ -13,8 +13,7 @@ regions[page_bottom] = Page bottom regions[sidebar_first] = First sidebar regions_hidden[] = sidebar_first -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/docroot/themes/stark/README.txt b/docroot/themes/stark/README.txt new file mode 100644 index 000000000..e7af281ee --- /dev/null +++ b/docroot/themes/stark/README.txt @@ -0,0 +1,25 @@ + +ABOUT STARK +----------- + +The Stark theme is provided for demonstration purposes; it uses Drupal's default +HTML markup and CSS styles. It can be used as a troubleshooting tool to +determine whether module-related CSS and JavaScript are interfering with a more +complex theme, and can be used by designers interested in studying Drupal's +default markup without the interference of changes commonly made by more complex +themes. + +To avoid obscuring CSS added to the page by Drupal or a contrib module, the +Stark theme itself has no styling, except just enough CSS to arrange the page in +a traditional "Header, sidebars, content, and footer" layout. See the layout.css +file for more information. + + +ABOUT DRUPAL THEMING +-------------------- + +To learn how to build your own custom theme and override Drupal's default code, +see the Theming Guide: http://drupal.org/theme-guide + +See the sites/all/themes/README.txt for more information on where to place your +custom themes to ensure easy maintenance and upgrades. diff --git a/docroot/themes/stark/stark.info b/docroot/themes/stark/stark.info index 6c1bc2048..e5c5beaa6 100644 --- a/docroot/themes/stark/stark.info +++ b/docroot/themes/stark/stark.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x stylesheets[all][] = layout.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/tests/behat.dkan_starter.yml b/tests/behat.dkan_starter.yml index 1708465c7..415fa9f92 100644 --- a/tests/behat.dkan_starter.yml +++ b/tests/behat.dkan_starter.yml @@ -1,14 +1,14 @@ ---- -default: - autoload: - - '%paths.base%/features/bootstrap/custom' - - '%paths.base%/features/bootstrap/dkan' - - '%paths.base%/features/bootstrap' - suites: - dkan_starter: - paths: - - '%paths.base%/features' - contexts: +--- +default: + autoload: + - "%paths.base%/features/bootstrap/custom" + - "%paths.base%/features/bootstrap/dkan" + - "%paths.base%/features/bootstrap" + suites: + dkan_starter: + paths: + - "%paths.base%/features" + contexts: - FeatureContext - Drupal\DrupalExtension\Context\MinkContext - Drupal\DrupalExtension\Context\DrupalContext @@ -20,8 +20,8 @@ default: - Drupal\DKANExtension\Context\ClamAvContext - Drupal\DKANExtension\Context\GroupContext - Drupal\DKANExtension\Context\WorkflowContext - - Drupal\DKANExtension\Context\DatasetContext: - - fields: + - Drupal\DKANExtension\Context\DatasetContext: + - fields: title: title description: body published: status @@ -38,7 +38,7 @@ default: license: field_license doi: field_doi citation: field_citation - - labels: + - labels: title: Title body: Description field_tags: Tags @@ -60,10 +60,10 @@ default: field_conforms_to: Data Standard field_language: Language og_group_ref: Groups - - sets: + - sets: field_spatial: Spatial / Geographical Coverage Area field_temporal_coverage: Temporal Coverage - - defaults: + - defaults: field_public_access_level: public field_hhs_attestation_negative: 1 field_license: odc-by @@ -71,15 +71,15 @@ default: - Drupal\DKANExtension\Context\ResourceContext - Drupal\DKANExtension\Context\DatastoreContext - Drupal\DKANExtension\Context\SearchAPIContext: - search_forms: - default: - form_css: '#dkan-sitewide-dataset-search-form' + search_forms: + default: + form_css: "#dkan-sitewide-dataset-search-form" form_field: edit-search form_button: edit-submit results_css: .view-dkan-datasets result_item_css: .views-row - - Devinci\DevinciExtension\Context\JavascriptContext: + - Devinci\DevinciExtension\Context\JavascriptContext: maximum_wait: 30 - dkan: - paths: - - '%paths.base%/../dkan/test/features' + dkan: + paths: + - "%paths.base%/../dkan/test/features"