Merging to master

This commit is contained in:
Randy Hoyt 2012-01-28 12:29:22 -06:00
commit 53cb8d1b2a
7 changed files with 27 additions and 786 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "openphoto-php"]
path = openphoto-php
url = https://github.com/openphoto/openphoto-php

View file

@ -3,7 +3,7 @@ Contributors: randyjensen,randyhoyt
Tags: openphoto,media Tags: openphoto,media
Requires at least: 3.2 Requires at least: 3.2
Tested up to: 3.3 Tested up to: 3.3
Stable tag: 0.9.3 Stable tag: 0.9.4
Insert photos from your OpenPhoto installation into your WordPress content through the media manager. Insert photos from your OpenPhoto installation into your WordPress content through the media manager.
@ -26,6 +26,11 @@ Find the project on [GitHub](https://github.com/openphoto/openphoto-wordpress "O
== Changelog == == Changelog ==
= 0.9.4 =
* Including openphoto-php as a Git submodule
* Use title from OpenPhoto instead of filename
* Handle change in OpenPhoto API related to value of pathOriginal
= 0.9.3 = = 0.9.3 =
* Force image sizes to be generated so image src will persist. * Force image sizes to be generated so image src will persist.
* Add option for image size referenced by the File URL button. * Add option for image size referenced by the File URL button.

View file

@ -1,424 +0,0 @@
<?php
/* OAuthSimple
* A simpler version of OAuth
*
* author: jr conlin
* mail: src@jrconlin.com
* copyright: unitedHeroes.net
* version: 1.2
* url: http://unitedHeroes.net/OAuthSimple
*
* Copyright (c) 2010, unitedHeroes.net
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the unitedHeroes.net nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY UNITEDHEROES.NET ''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 UNITEDHEROES.NET 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.
*/
/** Define a custom Exception for easy trap and detection
*/
class OAuthSimpleException extends Exception {}
class OAuthSimple {
var $_secrets;
var $_default_signature_method;
var $_action;
var $_nonce_chars;
/* Simple OAuth
*
* This class only builds the OAuth elements, it does not do the actual
* transmission or reception of the tokens. It does not validate elements
* of the token. It is for client use only.
*
* api_key is the API key, also known as the OAuth consumer key
* shared_secret is the shared secret (duh).
*
* Both the api_key and shared_secret are generally provided by the site
* offering OAuth services. You need to specify them at object creation
* because nobody <explative>ing uses OAuth without that minimal set of
* signatures.
*
* If you want to use the higher order security that comes from the
* OAuth token (sorry, I don't provide the functions to fetch that because
* sites aren't horribly consistent about how they offer that), you need to
* pass those in either with .signatures() or as an argument to the
* .sign() or .getHeaderString() functions.
*
* Example:
<code>
<?php
$oauthObject = new OAuthSimple();
$result = $oauthObject->sign(Array('path'=>'http://example.com/rest/',
'parameters'=> 'foo=bar&gorp=banana',
'signatures'=> Array(
'api_key'=>'12345abcd',
'shared_secret'=>'xyz-5309'
)));
?>
<a href="<?php print $result['signed_url']; ?>">Some Link</a>;
</code>
*
* that will sign as a "GET" using "SHA1-MAC" the url. If you need more than
* that, read on, McDuff.
*/
/** OAuthSimple creator
*
* Create an instance of OAuthSimple
*
* @param api_key {string} The API Key (sometimes referred to as the consumer key) This value is usually supplied by the site you wish to use.
* @param shared_secret (string) The shared secret. This value is also usually provided by the site you wish to use.
*/
function OAuthSimple ($APIKey = "",$sharedSecret=""){
if (!empty($APIKey))
$this->_secrets{'consumer_key'}=$APIKey;
if (!empty($sharedSecret))
$this->_secrets{'shared_secret'}=$sharedSecret;
$this->_default_signature_method="HMAC-SHA1";
$this->_action="GET";
$this->_nonce_chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
return $this;
}
/** reset the parameters and url
*
*/
function reset() {
$this->_parameters=null;
$this->path=null;
$this->sbs=null;
return $this;
}
/** set the parameters either from a hash or a string
*
* @param {string,object} List of parameters for the call, this can either be a URI string (e.g. "foo=bar&gorp=banana" or an object/hash)
*/
function setParameters ($parameters=Array()) {
if (is_string($parameters))
$parameters = $this->_parseParameterString($parameters);
if (empty($this->_parameters))
$this->_parameters = $parameters;
elseif (!empty($parameters))
$this->_parameters = array_merge($this->_parameters,$parameters);
if (empty($this->_parameters['oauth_nonce']))
$this->_getNonce();
if (empty($this->_parameters['oauth_timestamp']))
$this->_getTimeStamp();
if (empty($this->_parameters['oauth_consumer_key']))
$this->_getApiKey();
if (empty($this->_parameters['oauth_token']))
$this->_getAccessToken();
if (empty($this->_parameters['oauth_signature_method']))
$this->setSignatureMethod();
if (empty($this->_parameters['oauth_version']))
$this->_parameters['oauth_version']="1.0";
//error_log('parameters: '.print_r($this,1));
return $this;
}
// convienence method for setParameters
function setQueryString ($parameters) {
return $this->setParameters($parameters);
}
/** Set the target URL (does not include the parameters)
*
* @param path {string} the fully qualified URI (excluding query arguments) (e.g "http://example.org/foo")
*/
function setURL ($path) {
if (empty($path))
throw new OAuthSimpleException('No path specified for OAuthSimple.setURL');
$this->_path=$path;
return $this;
}
/** convienence method for setURL
*
* @param path {string} see .setURL
*/
function setPath ($path) {
return $this->_path=$path;
}
/** set the "action" for the url, (e.g. GET,POST, DELETE, etc.)
*
* @param action {string} HTTP Action word.
*/
function setAction ($action) {
if (empty($action))
$action = 'GET';
$action = strtoupper($action);
if (preg_match('/[^A-Z]/',$action))
throw new OAuthSimpleException('Invalid action specified for OAuthSimple.setAction');
$this->_action = $action;
return $this;
}
/** set the signatures (as well as validate the ones you have)
*
* @param signatures {object} object/hash of the token/signature pairs {api_key:, shared_secret:, oauth_token: oauth_secret:}
*/
function signatures ($signatures) {
if (!empty($signatures) && !is_array($signatures))
throw new OAuthSimpleException('Must pass dictionary array to OAuthSimple.signatures');
if (!empty($signatures)){
if (empty($this->_secrets)) {
$this->_secrets=Array();
}
$this->_secrets=array_merge($this->_secrets,$signatures);
}
// Aliases
if (isset($this->_secrets['api_key']))
$this->_secrets['consumer_key'] = $this->_secrets['api_key'];
if (isset($this->_secrets['access_token']))
$this->_secrets['oauth_token'] = $this->_secrets['access_token'];
if (isset($this->_secrets['access_secret']))
$this->_secrets['oauth_secret'] = $this->_secrets['access_secret'];
if (isset($this->_secrets['access_token_secret']))
$this->_secrets['oauth_secret'] = $this->_secrets['access_token_secret'];
// Gauntlet
if (empty($this->_secrets['consumer_key']))
throw new OAuthSimpleException('Missing required consumer_key in OAuthSimple.signatures');
if (empty($this->_secrets['shared_secret']))
throw new OAuthSimpleException('Missing requires shared_secret in OAuthSimple.signatures');
if (!empty($this->_secrets['oauth_token']) && empty($this->_secrets['oauth_secret']))
throw new OAuthSimpleException('Missing oauth_secret for supplied oauth_token in OAuthSimple.signatures');
return $this;
}
function setTokensAndSecrets($signatures) {
return $this->signatures($signatures);
}
/** set the signature method (currently only Plaintext or SHA-MAC1)
*
* @param method {string} Method of signing the transaction (only PLAINTEXT and SHA-MAC1 allowed for now)
*/
function setSignatureMethod ($method="") {
if (empty($method))
$method = $this->_default_signature_method;
$method = strtoupper($method);
switch($method)
{
case 'PLAINTEXT':
case 'HMAC-SHA1':
$this->_parameters['oauth_signature_method']=$method;
break;
default:
throw new OAuthSimpleException ("Unknown signing method $method specified for OAuthSimple.setSignatureMethod");
}
return $this;
}
/** sign the request
*
* note: all arguments are optional, provided you've set them using the
* other helper functions.
*
* @param args {object} hash of arguments for the call
* {action, path, parameters (array), method, signatures (array)}
* all arguments are optional.
*/
function sign($args=array()) {
if (!empty($args['action']))
$this->setAction($args['action']);
if (!empty($args['path']))
$this->setPath($args['path']);
if (!empty($args['method']))
$this->setSignatureMethod($args['method']);
if (!empty($args['signatures']))
$this->signatures($args['signatures']);
if (empty($args['parameters']))
$args['parameters']=array(); // squelch the warning.
$this->setParameters($args['parameters']);
$normParams = $this->_normalizedParameters();
$this->_parameters['oauth_signature'] = $this->_generateSignature($normParams);
return Array(
'parameters' => $this->_parameters,
'signature' => $this->_oauthEscape($this->_parameters['oauth_signature']),
'signed_url' => $this->_path . '?' . $this->_normalizedParameters(),
'header' => $this->getHeaderString(),
'sbs'=> $this->sbs
);
}
/** Return a formatted "header" string
*
* NOTE: This doesn't set the "Authorization: " prefix, which is required.
* I don't set it because various set header functions prefer different
* ways to do that.
*
* @param args {object} see .sign
*/
function getHeaderString ($args=array()) {
if (empty($this->_parameters['oauth_signature']))
$this->sign($args);
$result = 'OAuth ';
foreach ($this->_parameters as $pName=>$pValue)
{
if (strpos($pName,'oauth_') !== 0)
continue;
if (is_array($pValue))
{
foreach ($pValue as $val)
{
$result .= $pName .'="' . $this->_oauthEscape($val) . '", ';
}
}
else
{
$result .= $pName . '="' . $this->_oauthEscape($pValue) . '", ';
}
}
return preg_replace('/, $/','',$result);
}
// Start private methods. Here be Dragons.
// No promises are kept that any of these functions will continue to exist
// in future versions.
function _parseParameterString ($paramString) {
$elements = explode('&',$paramString);
$result = array();
foreach ($elements as $element)
{
list ($key,$token) = explode('=',$element);
if ($token)
$token = urldecode($token);
if (!empty($result[$key]))
{
if (!is_array($result[$key]))
$result[$key] = array($result[$key],$token);
else
array_push($result[$key],$token);
}
else
$result[$key]=$token;
}
//error_log('Parse parameters : '.print_r($result,1));
return $result;
}
function _oauthEscape($string) {
if ($string === 0)
return 0;
if (strlen($string) == 0)
return '';
if (is_array($string))
throw new OAuthSimpleException('Array passed to _oauthEscape');
$string = rawurlencode($string);
$string = str_replace('+','%20',$string);
$string = str_replace('!','%21',$string);
$string = str_replace('*','%2A',$string);
$string = str_replace('\'','%27',$string);
$string = str_replace('(','%28',$string);
$string = str_replace(')','%29',$string);
return $string;
}
function _getNonce($length=5) {
$result = '';
$cLength = strlen($this->_nonce_chars);
for ($i=0; $i < $length; $i++)
{
$rnum = rand(0,$cLength);
$result .= substr($this->_nonce_chars,$rnum,1);
}
$this->_parameters['oauth_nonce'] = $result;
return $result;
}
function _getApiKey() {
if (empty($this->_secrets['consumer_key']))
{
throw new OAuthSimpleException('No consumer_key set for OAuthSimple');
}
$this->_parameters['oauth_consumer_key']=$this->_secrets['consumer_key'];
return $this->_parameters['oauth_consumer_key'];
}
function _getAccessToken() {
if (!isset($this->_secrets['oauth_secret']))
return '';
if (!isset($this->_secrets['oauth_token']))
throw new OAuthSimpleException('No access token (oauth_token) set for OAuthSimple.');
$this->_parameters['oauth_token'] = $this->_secrets['oauth_token'];
return $this->_parameters['oauth_token'];
}
function _getTimeStamp() {
return $this->_parameters['oauth_timestamp'] = time();
}
function _normalizedParameters() {
$elements = array();
$ra = 0;
ksort($this->_parameters);
foreach ( $this->_parameters as $paramName=>$paramValue) {
if(strpos($paramValue, '@') === 0 && file_exists(substr($paramValue, 1)))
{
continue;
}
elseif (preg_match('/\w+_secret/',$paramName))
{
continue;
}
elseif (is_array($paramValue))
{
sort($paramValue);
foreach($paramValue as $element)
array_push($elements,$this->_oauthEscape($paramName).'='.$this->_oauthEscape($element));
continue;
}
array_push($elements,$this->_oauthEscape($paramName).'='.$this->_oauthEscape($paramValue));
}
return join('&',$elements);
}
function _generateSignature () {
$secretKey = '';
if(isset($this->_secrets['shared_secret']))
$secretKey = $this->_oauthEscape($this->_secrets['shared_secret']);
$secretKey .= '&';
if(isset($this->_secrets['oauth_secret']))
$secretKey .= $this->_oauthEscape($this->_secrets['oauth_secret']);
switch($this->_parameters['oauth_signature_method'])
{
case 'PLAINTEXT':
return urlencode($secretKey);
case 'HMAC-SHA1':
$this->sbs = $this->_oauthEscape($this->_action).'&'.$this->_oauthEscape($this->_path).'&'.$this->_oauthEscape($this->_normalizedParameters());
//error_log('SBS: '.$sigString);
return base64_encode(hash_hmac('sha1',$this->sbs,$secretKey,true));
default:
throw new OAuthSimpleException('Unknown signature method for OAuthSimple');
}
}
}
?>

View file

@ -1,133 +0,0 @@
<?php
if(!class_exists('OAuthSimple'))
require 'OAuthSimple.php';
class OpenPhotoOAuth
{
protected $client;
protected $host;
protected $consumerKey;
protected $consumerSecret;
protected $token;
protected $tokenSecret;
protected $version = '1';
protected $protocol = 'http';
protected $requestTokenPath= '/v%d/oauth/token/request';
protected $accessTokenPath = '/v%d/oauth/token/access';
protected $authorizePath = '/v%d/oauth/authorize';
public function __construct($host, $consumerKey = null, $consumerSecret = null, $token = null, $tokenSecret = null)
{
$this->host = $host;
$this->consumerKey = $consumerKey;
$this->consumerSecret = $consumerSecret;
$this->token = $token;
$this->tokenSecret = $tokenSecret;
}
public function get($endpoint, $params = null)
{
$curlEndpoint = $endpoint;
if(!empty($params))
$curlEndpoint .= sprintf('?%s', http_build_query($params));
$ch = curl_init($this->constructEndpoint($curlEndpoint, true, $params));
if(!empty($this->consumerKey))
{
$client = new OAuthSimple($this->consumerKey, $this->consumerSecret);
$request = $client->sign(
array(
'action' => 'GET',
'path' => $this->constructEndpoint($endpoint),
'version' => '1.0a',
'parameters' => $params,
'signatures' =>
array(
'consumer_key' => $this->consumerKey,
'consumer_secret' => $this->consumerSecret,
'access_token' => $this->token,
'access_secret' => $this->tokenSecret
)
)
);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: {$request['header']}"));
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resp = curl_exec($ch);
curl_close($ch);
return $resp;
}
public function getAccessToken($params = null)
{
$client = new OAuthSimple($this->consumerKey, $this->consumerSecret);
}
public function getAuthorizeUrl($token, $params = null)
{
$client = new OAuthSimple($this->consumerKey, $this->consumerSecret);
$request = $client->sign(
array(
'path' => '',
'parameters' => $params,
'version' => '1.0a',
'signatures' => array(
'consumer_key' => $this->consumerKey,
'consumer_secret' => $this->consumerSecret
)
)
);
return $request['signed_url'];
}
public function getRequestToken($params = null)
{
}
public function post($endpoint, $params = null)
{
$ch = curl_init($this->constructEndpoint($endpoint, true));
if(!empty($this->consumerKey))
{
$client = new OAuthSimple($this->consumerKey, $this->consumerSecret);
$request = $client->sign(
array(
'action' => 'POST',
'path' => $this->constructEndpoint($endpoint),
'version' => '1.0a',
'parameters' => $params,
'signatures' =>
array(
'consumer_key' => $this->consumerKey,
'consumer_secret' => $this->consumerSecret,
'access_token' => $this->token,
'access_secret' => $this->tokenSecret
)
)
);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: {$request['header']}"));
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
if(!empty($params))
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$resp = curl_exec($ch);
curl_close($ch);
return $resp;
}
private function constructEndpoint($endpoint, $includeConsumerKey = false)
{
if($includeConsumerKey)
{
if(stristr($endpoint, '?') === false)
return sprintf('http://%s%s?oauth_consumer_key=%s', $this->host, $endpoint, $this->consumerKey);
else
return sprintf('http://%s%s&oauth_consumer_key=%s', $this->host, $endpoint, $this->consumerKey);
}
else
{
return sprintf('http://%s%s', $this->host, $endpoint);
}
}
}

View file

@ -1,97 +0,0 @@
Open Photo API / PHP Library
=======================
#### OpenPhoto, a photo service for the masses
----------------------------------------
<a name="php"></a>
### How to use the library
To use the library you need to first include `OpenPhotoOAuth.php`, then instantiate an instance of the class and start making calls.
include 'OpenPhotoOAuth.php';
$client = new OpenPhotoOAuth($host, $consumerKey, $consumerSecret, $token, $tokenSecret);
$resp = $client->get('/photos/list.json');
$resp = $client->post('/photo/62/update.json', array('tags' => 'tag1,tag2'));
----------------------------------------
<a name="cli"></a>
### Using from the command line
Make sure that the `openphoto` file is executable.
chown o+x openphoto
You'll then want to export your secrets to the environment.
We suggest putting them in a file and sourcing it prior to running `openphoto` commands.
<a href="#credentials">Click here for instructions on getting credentials</a>.
# env.sh
export consumerKey=your_consumer_key
export consumerSecret=your_consumer_secret
export token=your_access_token
export tokenSecret=your_access_token_secret
You'll need to source that file once for each terminal session.
source env.sh
These are the options you can pass to the shell program.
-h hostname # default=localhost
-e endpoint # default=/photos/list.json
-X method # default=GET
-F params # i.e. -F 'title=my title' -F 'tags=mytag1,mytag1'
-p # pretty print the json
-v # verbose output
--encode # base 64 encode the photo
Now you can run commands to the OpenPhoto API from your shell!
./openphoto -h current.openphoto.me -p -e /photo/62/view.json -F 'returnSizes=20x20'
{
"message" : "Photo 62",
"code" : 200,
"result" : {
"tags" : [
],
"id" : "62",
"appId" : "current.openphoto.me",
"pathBase" : "\/base\/201108\/1312956581-opmeqViHrD.jpg",
"dateUploadedMonth" : "08",
"dateTakenMonth" : "08",
"exifCameraMake" : "",
"dateTaken" : "1312956581",
"title" : "Tomorrowland Main Stage 2011",
"height" : "968",
"description" : "",
"creativeCommons" : "BY-NC",
"dateTakenYear" : "2011",
"dateUploadedDay" : "09",
"longitude" : "4",
"host" : "opmecurrent.s3.amazonaws.com",
"hash" : "0455675a8c42148238b81ed1d8db655c45ae055a",
"status" : "1",
"width" : "1296",
"dateTakenDay" : "09",
"permission" : "1",
"pathOriginal" : "\/original\/201108\/1312956581-opmeqViHrD.jpg",
"size" : "325",
"dateUploadedYear" : "2011",
"views" : "0",
"latitude" : "50.8333",
"dateUploaded" : "1312956583",
"exifCameraModel" : "",
"Name" : "62",
"path20x20" : "http:\/\/current.openphoto.me\/photo\/62\/create\/ceb90\/20x20.jpg"
}
}
<a name="credentials"></a>
#### Getting your credentials
You can get your credentals by clicking on the arrow next to your email address once you're logged into your site and then clicking on settings.
If you don't have any credentials then you can create one for yourself by going to `/v1/oauth/flow`.
Once completed go back to the settings page and you should see the credential you just created

View file

@ -1,118 +0,0 @@
#!/usr/bin/php
<?php
$consumerKey = getenv('consumerKey');
$consumerSecret = getenv('consumerSecret');
$token = getenv('token');
$tokenSecret = getenv('tokenSecret');
$arguments = getopt('F:X:h:e:pv', array('encode::'));
$host = 'localhost';
if(isset($arguments['h']))
$host = $arguments['h'];
$method = 'get';
if(isset($arguments['X']))
$method = strtolower($arguments['X']);
$endpoint = '/photos/pageSize-3/list.json';
if(isset($arguments['e']))
$endpoint = $arguments['e'];
$pretty = false;
if(isset($arguments['p']))
$pretty = true;
$verbose = false;
if(isset($arguments['v']))
$verbose = true;
$encode = false;
if(isset($arguments['encode']))
$encode = true;
$fields = array();
if(isset($arguments['F']))
{
foreach((array)$arguments['F'] as $field)
{
$parts = explode('=', $field);
if($encode && $parts[0] == 'photo' && strncmp($parts[1][0], '@', 1) == 0 && is_file(substr($parts[1], 1)))
$fields[$parts[0]] = base64_encode(file_get_contents(substr($parts[1], 1)));
else
$fields[$parts[0]] = $parts[1];
}
}
include 'OpenPhotoOAuth.php';
$client = new OpenPhotoOAuth($host, $consumerKey, $consumerSecret, $token, $tokenSecret);
if($method == 'get')
$resp = $client->get($endpoint, $fields);
elseif($method == 'post')
$resp = $client->post($endpoint, $fields);
if($verbose)
echo sprintf("==========\nMethod: %s\nHost: %s\nEndpoint: %s\n==========\n\n", $method, $host, $endpoint);
if($pretty)
echo indent($resp);
else
echo $resp;
if($verbose || $pretty)
echo "\n";
// from https://gist.github.com/906036
function indent($json) {
$result = '';
$pos = 0;
$strLen = strlen($json);
$indentStr = ' ';
$newLine = "\n";
$prevChar = '';
$outOfQuotes = true;
for ($i=0; $i<=$strLen; $i++) {
// Grab the next character in the string.
$char = substr($json, $i, 1);
// Put spaces in front of :
if ($outOfQuotes && $char == ':' && $prevChar != ' ') {
$result .= ' ';
}
if ($outOfQuotes && $char != ' ' && $prevChar == ':') {
$result .= ' ';
}
// Are we inside a quoted string?
if ($char == '"' && $prevChar != '\\') {
$outOfQuotes = !$outOfQuotes;
// If this character is the end of an element,
// output a new line and indent the next line.
} else if(($char == '}' || $char == ']') && $outOfQuotes) {
$result .= $newLine;
$pos --;
for ($j=0; $j<$pos; $j++) {
$result .= $indentStr;
}
}
// Add the character to the result string.
$result .= $char;
// If the last character was the beginning of an element,
// output a new line and indent the next line.
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
$result .= $newLine;
if ($char == '{' || $char == '[') {
$pos ++;
}
for ($j = 0; $j < $pos; $j++) {
$result .= $indentStr;
}
}
$prevChar = $char;
}
return $result;
}

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
Plugin Name: OpenPhoto for WordPress Plugin Name: OpenPhoto for WordPress
Version: 0.9.3 Version: 0.9.4
Plugin URI: https://github.com/openphoto/openphoto-wordpress Plugin URI: https://github.com/openphoto/openphoto-wordpress
Author: Randy Hoyt, Randy Jensen Author: Randy Hoyt, Randy Jensen
Author URI: http://cultivatr.com/ Author URI: http://cultivatr.com/
@ -208,7 +208,16 @@ class WP_OpenPhoto {
$src["thumbnail"] = $photo->{"photo".$sizes['thumbnail']}[0]; $src["thumbnail"] = $photo->{"photo".$sizes['thumbnail']}[0];
$src["medium"] = $photo->{"photo".$sizes['medium']}[0]; $src["medium"] = $photo->{"photo".$sizes['medium']}[0];
$src["large"] = $photo->{"photo".$sizes['large']}[0]; $src["large"] = $photo->{"photo".$sizes['large']}[0];
$src["original"] = 'http://'.$photo->host.$photo->pathOriginal; $src["original"] = $photo->pathOriginal;
if (strpos($src["original"],"http")===false) $src["original"] = 'http://'.$photo->host.$photo->pathOriginal; // in older versions of the API, pathOriginal did not have the full address
if ("" == $photo->title) {
$info = pathinfo(basename($src["original"]));
$photo->title = basename($src["original"],'.'.$info['extension']);
}
echo '<div id="media-item-'.$unique_id.'" class="media-item child-of-'.$post_id.' preloaded"><div class="progress" style="display: none; "></div><div id="media-upload-error-'.$unique_id.'"></div><div class="filename"></div>'; echo '<div id="media-item-'.$unique_id.'" class="media-item child-of-'.$post_id.' preloaded"><div class="progress" style="display: none; "></div><div id="media-upload-error-'.$unique_id.'"></div><div class="filename"></div>';
echo '<input type="hidden" id="type-of-'.$unique_id.'" value="image">'; echo '<input type="hidden" id="type-of-'.$unique_id.'" value="image">';
@ -216,22 +225,18 @@ class WP_OpenPhoto {
echo '<a class="toggle describe-toggle-off" href="#">Hide</a>'; echo '<a class="toggle describe-toggle-off" href="#">Hide</a>';
echo '<input type="hidden" name="attachments['.$unique_id.'][menu_order]" value="0">'; echo '<input type="hidden" name="attachments['.$unique_id.'][menu_order]" value="0">';
echo '<div class="filename new"><span class="title">'; echo '<div class="filename new"><span class="title">';
if (! empty($photo->title) ) { echo esc_attr($photo->title);
echo $photo->title;
} else {
substr(strrchr($photo->pathOriginal, "/"), 1 );
}
echo '</span></div>'; echo '</span></div>';
echo '<table class="slidetoggle describe startclosed">'; echo '<table class="slidetoggle describe startclosed">';
echo '<thead class="media-item-info" id="media-head-'.$unique_id.'">'; echo '<thead class="media-item-info" id="media-head-'.$unique_id.'">';
echo '<tr valign="top">'; echo '<tr valign="top">';
echo '<td class="A1B1" id="thumbnail-head-'.$unique_id.'">'; echo '<td class="A1B1" id="thumbnail-head-'.$unique_id.'">';
echo '<p style="height:100px;padding-right:10px;"><a href="http://'.$photo->appId.$photo->pathOriginal.'" target="_blank"><img class="thumbnail" src="'.$photo->path128x128.'" alt="" style="margin-top: 3px;"></a></p>'; echo '<p style="height:100px;padding-right:10px;"><a href="'.$src["original"].'" target="_blank"><img class="thumbnail" src="'.$photo->path128x128.'" alt="" style="margin-top: 3px;"></a></p>';
//echo '<p><input type="button" id="imgedit-open-btn-'.$unique_id.'" onclick="imageEdit.open( '.$unique_id.', &quot;98f2ea4727&quot; )" class="button" value="Edit Image"> <img src="'.home_url().'/wp-admin/images/wpspin_light.gif" class="imgedit-wait-spin" alt=""></p>'; //echo '<p><input type="button" id="imgedit-open-btn-'.$unique_id.'" onclick="imageEdit.open( '.$unique_id.', &quot;98f2ea4727&quot; )" class="button" value="Edit Image"> <img src="'.home_url().'/wp-admin/images/wpspin_light.gif" class="imgedit-wait-spin" alt=""></p>';
echo '</td>'; echo '</td>';
echo '<td>'; echo '<td>';
echo '<p><strong>File name:</strong> '.substr(strrchr($photo->pathOriginal, "/"), 1 ).'</p>'; echo '<p><strong>File name:</strong> '.$src["original"].'</p>';
echo '<p><strong>File type:</strong> .'.substr(strrchr($photo->pathOriginal, "."), 1 ).'</p>'; echo '<p><strong>File type:</strong> .'.$src["original"].'</p>';
echo '<p><strong>Upload date:</strong> '.date('F d Y', (int) $photo->dateUploaded).'</p>'; echo '<p><strong>Upload date:</strong> '.date('F d Y', (int) $photo->dateUploaded).'</p>';
echo '<p><strong>Dimensions:</strong> <span id="media-dims-'.$unique_id.'">'.$photo->width.'&nbsp;×&nbsp;'.$photo->height.'</span> </p>'; echo '<p><strong>Dimensions:</strong> <span id="media-dims-'.$unique_id.'">'.$photo->width.'&nbsp;×&nbsp;'.$photo->height.'</span> </p>';
echo '</td>'; echo '</td>';
@ -243,7 +248,7 @@ class WP_OpenPhoto {
echo '<tr><td style="display:none" colspan="2" class="image-editor" id="image-editor-'.$unique_id.'"></td></tr>'; echo '<tr><td style="display:none" colspan="2" class="image-editor" id="image-editor-'.$unique_id.'"></td></tr>';
echo '<tr class="post_title form-required">'; echo '<tr class="post_title form-required">';
echo '<th valign="top" scope="row" class="label"><label for="attachments['.$unique_id.'][post_title]"><span class="alignleft">Title</span><span class="alignright"><abbr title="required" class="required">*</abbr></span><br class="clear"></label></th>'; echo '<th valign="top" scope="row" class="label"><label for="attachments['.$unique_id.'][post_title]"><span class="alignleft">Title</span><span class="alignright"><abbr title="required" class="required">*</abbr></span><br class="clear"></label></th>';
echo '<td class="field"><input type="text" class="text title-text" id="attachments['.$unique_id.'][post_title]" name="attachments['.$unique_id.'][post_title]" value="'.basename($photo->pathOriginal).'" aria-required="true"></td>'; echo '<td class="field"><input type="text" class="text title-text" id="attachments['.$unique_id.'][post_title]" name="attachments['.$unique_id.'][post_title]" value="'.$photo->title.'" aria-required="true"></td>';
echo '</tr>'; echo '</tr>';
echo '<tr class="image_alt">'; echo '<tr class="image_alt">';
echo '<th valign="top" scope="row" class="label"><label for="attachments['.$unique_id.'][image_alt]"><span class="alignleft">Alternate Text</span><br class="clear"></label></th>'; echo '<th valign="top" scope="row" class="label"><label for="attachments['.$unique_id.'][image_alt]"><span class="alignleft">Alternate Text</span><br class="clear"></label></th>';
@ -310,7 +315,7 @@ class WP_OpenPhoto {
echo '<input type="radio" disabled="disabled" /><label for="image-size-large-'.$unique_id.'">Large</label>'; echo '<input type="radio" disabled="disabled" /><label for="image-size-large-'.$unique_id.'">Large</label>';
} }
echo '</div>'; echo '</div>';
echo '<div class="image-size-item"><input type="radio" name="attachments['.$unique_id.'][image-size]" id="image-size-full-'.$unique_id.'" value="full" alt="http://'.$photo->host.$photo->pathOriginal.'" data-image-height="'.$photo->height.'" data-image-width="'.$photo->width.'"' . $checked . '><label for="image-size-full-'.$unique_id.'">Full Size</label> <label for="image-size-full-'.$unique_id.'" class="help">('.$photo->width.'&nbsp;×&nbsp;'.$photo->height.')</label></div>'; echo '<div class="image-size-item"><input type="radio" name="attachments['.$unique_id.'][image-size]" id="image-size-full-'.$unique_id.'" value="full" alt="'.$src["original"].'" data-image-height="'.$photo->height.'" data-image-width="'.$photo->width.'"' . $checked . '><label for="image-size-full-'.$unique_id.'">Full Size</label> <label for="image-size-full-'.$unique_id.'" class="help">('.$photo->width.'&nbsp;×&nbsp;'.$photo->height.')</label></div>';
echo '</td>'; echo '</td>';
echo '</tr>'; echo '</tr>';
echo '<tr class="submit">'; echo '<tr class="submit">';