Utils.php

File

drupal/core/vendor/easyrdf/easyrdf/lib/EasyRdf/Utils.php
View source
<?php

/**
 * EasyRdf
 *
 * LICENSE
 *
 * Copyright (c) 2009-2012 Nicholas J Humfrey.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. The name of the author 'Nicholas J Humfrey" may be used to endorse or
 *    promote products derived from this software without specific prior
 *    written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package    EasyRdf
 * @copyright  Copyright (c) 2009-2012 Nicholas J Humfrey
 * @license    http://www.opensource.org/licenses/bsd-license.php
 * @version    $Id$
 */

/**
 * Class containing static utility functions
 *
 * @package    EasyRdf
 * @copyright  Copyright (c) 2009-2010 Nicholas J Humfrey
 * @license    http://www.opensource.org/licenses/bsd-license.php
 */
class EasyRdf_Utils {

  /**
   * Convert a string into CamelCase
   *
   * A capital letter is inserted for any non-letter (including userscore).
   * For example:
   * 'hello world' becomes HelloWorld
   * 'rss-tag-soup' becomes RssTagSoup
   * 'FOO//BAR' becomes FooBar
   *
   * @param string The input string
   * @return string The input string converted to CamelCase
   */
  public static function camelise($str) {
    $cc = '';
    foreach (preg_split("/[\\W_]+/", $str) as $part) {
      $cc .= ucfirst(strtolower($part));
    }
    return $cc;
  }

  /**
   * Check if something is an associative array
   *
   * Note: this method only checks the key of the first value in the array.
   *
   * @param mixed $param The variable to check
   * @return bool true if the variable is an associative array
   */
  public static function isAssociativeArray($param) {
    if (is_array($param)) {
      $keys = array_keys($param);
      if ($keys[0] === 0) {
        return false;
      }
      else {
        return true;
      }
    }
    else {
      return false;
    }
  }

  /**
   * Remove the fragment from a URI (if it has one)
   *
   * @param mixed $uri A URI
   * @return string The same URI with the fragment removed
   */
  public static function removeFragmentFromUri($uri) {
    $pos = strpos($uri, '#');
    if ($pos === false) {
      return $uri;
    }
    else {
      return substr($uri, 0, $pos);
    }
  }

  /** Return pretty-print view of a resource URI
   *
   * This method is mainly intended for internal use and is used by
   * EasyRdf_Graph and EasyRdf_Sparql_Result to format a resource
   * for display.
   *
   * @param  mixed $resource An EasyRdf_Resource object or an associative array
   * @param  bool  $html     Set to true to format the dump using HTML
   * @param  string $color   The colour of the text
   * @return string
   */
  public static function dumpResourceValue($resource, $html = true, $color = 'blue') {
    if (is_object($resource)) {
      $resource = strval($resource);
    }
    elseif (is_array($resource)) {
      $resource = $resource['value'];
    }
    $short = EasyRdf_Namespace::shorten($resource);
    if ($html) {
      $escaped = htmlentities($resource);
      if (substr($resource, 0, 2) == '_:') {
        $href = '#' . $escaped;
      }
      else {
        $href = $escaped;
      }
      if ($short) {
        return "<a href='{$href}' style='text-decoration:none;color:{$color}'>{$short}</a>";
      }
      else {
        return "<a href='{$href}' style='text-decoration:none;color:{$color}'>{$escaped}</a>";
      }
    }
    else {
      if ($short) {
        return $short;
      }
      else {
        return $resource;
      }
    }
  }

  /** Return pretty-print view of a literal
   *
   * This method is mainly intended for internal use and is used by
   * EasyRdf_Graph and EasyRdf_Sparql_Result to format a literal
   * for display.
   *
   * @param  mixed $literal  An EasyRdf_Literal object or an associative array
   * @param  bool  $html     Set to true to format the dump using HTML
   * @param  string $color   The colour of the text
   * @return string
   */
  public static function dumpLiteralValue($literal, $html = true, $color = 'black') {
    if (is_object($literal)) {
      $literal = $literal
        ->toArray();
    }
    elseif (!is_array($literal)) {
      $literal = array(
        'value' => $literal,
      );
    }
    $text = '"' . $literal['value'] . '"';
    if (isset($literal['lang'])) {
      $text .= '@' . $literal['lang'];
    }
    if (isset($literal['datatype'])) {
      $datatype = EasyRdf_Namespace::shorten($literal['datatype']);
      $text .= "^^{$datatype}";
    }
    if ($html) {
      return "<span style='color:{$color}'>" . htmlentities($text, ENT_COMPAT, "UTF-8") . "</span>";
    }
    else {
      return $text;
    }
  }

  /** Clean up and split a mime-type up into its parts
   *
   * @param  string $mimeType   A MIME Type, optionally with parameters
   * @return array  $type, $parameters
   */
  public static function parseMimeType($mimeType) {
    $parts = explode(';', strtolower($mimeType));
    $type = trim(array_shift($parts));
    $params = array();
    foreach ($parts as $part) {
      if (preg_match("/^\\s*(\\w+)\\s*=\\s*(.+?)\\s*\$/", $part, $matches)) {
        $params[$matches[1]] = $matches[2];
      }
    }
    return array(
      $type,
      $params,
    );
  }

  /** Execute a command as a pipe
   *
   * The proc_open() function is used to open a pipe to a
   * a command line process, writing $input to STDIN, returning STDOUT
   * and throwing an exception if anything is written to STDERR or the
   * process returns non-zero.
   *
   * @param  string $command   The command to execute
   * @param  array  $args      Optional list of arguments to pass to the command
   * @param  string $input     Optional buffer to send to the command
   * @param  string $dir       Path to directory to run command in (defaults to /tmp)
   * @return string The result of the command, printed to STDOUT
   */
  public static function execCommandPipe($command, $args = null, $input = null, $dir = null) {
    $descriptorspec = array(
      0 => array(
        'pipe',
        'r',
      ),
      1 => array(
        'pipe',
        'w',
      ),
      2 => array(
        'pipe',
        'w',
      ),
    );

    // Use the system tmp directory by default
    if (!$dir) {
      $dir = sys_get_temp_dir();
    }
    if (is_array($args)) {
      $fullCommand = implode(' ', array_map('escapeshellcmd', array_merge(array(
        $command,
      ), $args)));
    }
    else {
      $fullCommand = escapeshellcmd($command);
      if ($args) {
        $fullCommand .= ' ' . escapeshellcmd($args);
      }
    }
    $process = proc_open($fullCommand, $descriptorspec, $pipes, $dir);
    if (is_resource($process)) {

      // $pipes now looks like this:
      // 0 => writeable handle connected to child stdin
      // 1 => readable handle connected to child stdout
      // 2 => readable handle connected to child stderr
      if ($input) {
        fwrite($pipes[0], $input);
      }
      fclose($pipes[0]);
      $output = stream_get_contents($pipes[1]);
      fclose($pipes[1]);
      $error = stream_get_contents($pipes[2]);
      fclose($pipes[2]);

      // It is important that you close any pipes before calling
      // proc_close in order to avoid a deadlock
      $returnValue = proc_close($process);
      if ($returnValue) {
        throw new EasyRdf_Exception("Error while executing command {$command}: " . $error);
      }
    }
    else {
      throw new EasyRdf_Exception("Failed to execute command {$command}");
    }
    return $output;
  }

}

Classes

Namesort descending Description
EasyRdf_Utils Class containing static utility functions