2011-12-25 10:07:20 +01:00
< ? php # $Id$
2011-12-13 12:29:05 +01:00
if ( IN_serendipity !== true ) {
die ( " Don't hack! " );
}
// Probe for a language include with constants. Still include defines later on, if some constants were missing
$probelang = dirname ( __FILE__ ) . '/' . $serendipity [ 'charset' ] . 'lang_' . $serendipity [ 'lang' ] . '.inc.php' ;
if ( file_exists ( $probelang )) {
include $probelang ;
}
include dirname ( __FILE__ ) . '/lang_en.inc.php' ;
if ( ! function_exists ( 'ifRemember' )) {
// dummy stub function for older 0.9 versions
function ifRemember ( $a = null , $b = null , $c = null , $d = null ) {
return true ;
}
}
class serendipity_event_imageselectorplus extends serendipity_event
{
var $title = PLUGIN_EVENT_IMAGESELECTORPLUS_NAME ;
var $gotMilk = false ;
var $cache = array ();
function introspect ( & $propbag )
{
global $serendipity ;
$propbag -> add ( 'name' , PLUGIN_EVENT_IMAGESELECTORPLUS_NAME );
$propbag -> add ( 'description' , PLUGIN_EVENT_IMAGESELECTORPLUS_DESC );
$propbag -> add ( 'stackable' , false );
$propbag -> add ( 'author' , 'Garvin Hicking, Vladimir Ajgl, Adam Charnock' );
2012-08-17 12:09:13 +02:00
$propbag -> add ( 'version' , '0.32' );
2011-12-13 12:29:05 +01:00
$propbag -> add ( 'requirements' , array (
'serendipity' => '0.9' ,
'smarty' => '2.6.7' ,
'php' => '4.1.0'
));
$propbag -> add ( 'groups' , array ( 'IMAGES' , 'MARKUP' ));
$propbag -> add ( 'event_hooks' , array (
'entries_header' => true ,
'entry_display' => true ,
'backend_entry_presave' => true ,
'backend_publish' => true ,
'backend_save' => true ,
'frontend_image_add_unknown' => true ,
'frontend_image_add_filenameonly' => true ,
'frontend_image_selector_submit' => true ,
'frontend_image_selector_more' => true ,
'frontend_image_selector_imagecomment' => true ,
'frontend_image_selector_imagelink' => true ,
'frontend_image_selector_imagealign' => true ,
'frontend_image_selector_imagesize' => true ,
'frontend_image_selector_hiddenfields' => true ,
'frontend_image_selector' => true ,
'backend_image_add' => true ,
'backend_image_addHotlink' => true ,
'backend_image_addform' => true ,
'frontend_display' => true
));
$this -> markup_elements = array (
array (
'name' => 'ENTRY_BODY' ,
'element' => 'body' ,
),
array (
'name' => 'EXTENDED_BODY' ,
'element' => 'extended' ,
)
);
$conf_array = array ( 'thumb_max_width' , 'thumb_max_height' , 'unzipping' , 'autoresize' , 'force_jhead' );
foreach ( $this -> markup_elements as $element ) {
$conf_array [] = $element [ 'name' ];
}
$propbag -> add ( 'configuration' , $conf_array );
}
function introspect_config_item ( $name , & $propbag ) {
global $serendipity ;
switch ( $name ) {
case 'force_jhead' :
$propbag -> add ( 'type' , 'boolean' );
$propbag -> add ( 'name' , PLUGIN_EVENT_IMAGESELECTORPLUS_JHEAD );
$propbag -> add ( 'description' , PLUGIN_EVENT_IMAGESELECTORPLUS_JHEAD_DESC );
$propbag -> add ( 'default' , 'false' );
break ;
case 'thumb_max_width' :
$propbag -> add ( 'type' , 'string' );
$propbag -> add ( 'name' , PLUGIN_EVENT_IMAGESELECTORPLUS_MAXWIDTH );
$propbag -> add ( 'description' , '' );
$propbag -> add ( 'default' , '0' );
break ;
case 'thumb_max_height' :
$propbag -> add ( 'type' , 'string' );
$propbag -> add ( 'name' , PLUGIN_EVENT_IMAGESELECTORPLUS_MAXHEIGHT );
$propbag -> add ( 'description' , '' );
$propbag -> add ( 'default' , '0' );
break ;
case 'unzipping' :
if ( class_exists ( 'ZipArchive' )) {
$propbag -> add ( 'type' , 'boolean' );
$propbag -> add ( 'name' , PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_FILES );
$propbag -> add ( 'description' , PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_FILES_BLABLAH );
$propbag -> add ( 'default' , 'true' );
}
break ;
case 'autoresize' :
$propbag -> add ( 'type' , 'boolean' );
$propbag -> add ( 'name' , PLUGIN_EVENT_IMAGESELECTORPLUS_AUTORESIZE );
$propbag -> add ( 'description' , PLUGIN_EVENT_IMAGESELECTORPLUS_AUTORESIZE_DESC );
$propbag -> add ( 'default' , 'false' );
break ;
default :
if ( class_exists ( 'SimpleXMLElement' )) {
$propbag -> add ( 'type' , 'boolean' );
$propbag -> add ( 'name' , constant ( $name ));
$propbag -> add ( 'description' , sprintf ( APPLY_MARKUP_TO , " - " . constant ( $name )));
$propbag -> add ( 'default' , 'true' );
}
break ;
}
return true ;
}
// to recash all entries after installing the plugin
function install () {
serendipity_plugin_api :: hook_event ( 'backend_cache_entries' , $this -> title );
}
// to recash all entries after uninstalling the plugin
2012-06-13 14:47:45 +02:00
function uninstall ( & $propbag ) {
2011-12-13 12:29:05 +01:00
serendipity_plugin_api :: hook_event ( 'backend_cache_purge' , $this -> title );
serendipity_plugin_api :: hook_event ( 'backend_cache_entries' , $this -> title );
}
function generate_content ( & $title ) {
$title = $this -> title ;
}
function httpize ( $path ) {
global $serendipity ;
if ( preg_match ( '@' . $serendipity [ 'uploadPath' ] . '(.+)$@imsU' , $path , $match )) {
return $serendipity [ 'serendipityHTTPPath' ] . $serendipity [ 'uploadHTTPPath' ] . $match [ 1 ];
}
return preg_replace ( '@^' . preg_quote ( $_SERVER [ 'DOCUMENT_ROOT' ]) . '(.*)$@imsU' , '\1' , $path );
}
function selected () {
global $serendipity ;
if ( $serendipity [ 'GET' ][ 'subpage' ] == 's9yisp' ) {
return true ;
}
return false ;
}
function resizeThumb ( $sizes , $target ) {
global $serendipity ;
// Thumbsize: 75
// A: 100x300
// B: 300x100
// s9y A: 25x75
// s9y B: 75x25
// Max-Height: 0
// Max-Width : 75
// s9y A:
// s9y B:
// Max-Height: 0
// Max-Height: 75
// s9y A: 25x75
// s9y B: 225x75
$fdim = @ serendipity_getimagesize ( $target , '' , '' );
if ( ! isset ( $serendipity [ 'thumbConstraint' ])) {
// Original code, for older versions of s9y
$s9ysizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], $serendipity [ 'thumbSize' ]);
if ( $fdim [ 0 ] >= $fdim [ 1 ]) {
$orientation = 'Landscape' ;
} else {
$orientation = 'Portrait' ;
}
if ( $sizes [ 'width' ] == 0 ) {
if ( $orientation == 'Landscape' ) {
$_newsizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], null , $sizes [ 'height' ]);
} else {
$_newsizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], $sizes [ 'height' ], null );
}
$newsizes = array ( 'width' => $_newsizes [ 0 ], 'height' => $_newsizes [ 1 ]);
} elseif ( $sizes [ 'height' ] == 0 ) {
if ( $orientation == 'Landscape' ) {
$_newsizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], $sizes [ 'width' ], null );
} else {
$_newsizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], null , $sizes [ 'width' ]);
}
$newsizes = array ( 'width' => $_newsizes [ 0 ], 'height' => $_newsizes [ 1 ]);
} else {
$newsizes = $sizes ;
array (
0 => $sizes [ 'width' ],
1 => $sizes [ 'height' ]
);
}
} else {
// Newer s9y version that understands how to constrain images properly
$s9ysizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], $serendipity [ 'thumbSize' ], $serendipity [ 'thumbConstraint' ]);
$orientation = 'size' ;
if ( $sizes [ 'width' ] == 0 ) {
$_newsizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], $sizes [ 'height' ], 'height' );
} elseif ( $sizes [ 'height' ] == 0 ) {
$_newsizes = serendipity_calculate_aspect_size ( $fdim [ 0 ], $fdim [ 1 ], $sizes [ 'width' ], 'width' );
} else {
$_newsizes = $sizes ;
}
$newsizes = array ( 'width' => $_newsizes [ 0 ], 'height' => $_newsizes [ 1 ]);
}
echo " Resizing thumb of " . $orientation . " " . $fdim [ 0 ] . " x " . $fdim [ 1 ] . " to " . $_newsizes [ 0 ] . " x " . $_newsizes [ 1 ] . " instead of " . $s9ysizes [ 0 ] . " x " . $s9ysizes [ 1 ] . " ...<br /> \n " ;
$dirname = dirname ( $target ) . '/' ;
$dirname = str_replace ( $serendipity [ 'serendipityPath' ] . $serendipity [ 'uploadPath' ], '' , $dirname );
serendipity_makeThumbnail ( basename ( $target ), $dirname , $newsizes , $serendipity [ 'thumbSuffix' ]);
}
2012-06-13 14:47:45 +02:00
function event_hook ( $event , & $bag , & $eventData , $addData = null ) {
2011-12-13 12:29:05 +01:00
global $serendipity ;
$hooks = & $bag -> get ( 'event_hooks' );
if ( isset ( $hooks [ $event ])) {
switch ( $event ) {
case 'backend_image_addform' :
if ( class_exists ( 'ZipArchive' )) {
$checkedY = " " ;
$checkedN = " " ;
$this -> get_config ( 'unzipping' ) ? $checkedY = " checked='checked' " : $checkedN = " checked='checked' " ;
?>
< p >
< strong >< ? php echo PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_FILES ; ?> </strong><br />
< ? php echo PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_FILES_DESC ; ?>
< p >
< input type = " radio " class = " input_radio " id = " unzip_yes " name = " serendipity[unzip_archives] " value = " <?php echo YES;?> " < ? php echo $checkedY ; ?> ><label for="unzip_yes"><?php echo YES;?></label>
< input type = " radio " class = " input_radio " id = " unzip_no " name = " serendipity[unzip_archives] " value = " <?php echo NO;?> " < ? php echo $checkedN ; ?> ><label for="unzip_no"><?php echo NO;?></label>
</ p >
</ p >
< ? php
}
?>
< br />
< strong >< ? php echo PLUGIN_EVENT_IMAGESELECTORPLUS_QUICKBLOG ; ?> :</strong><br />
< em >< ? php echo PLUGIN_EVENT_IMAGESELECTORPLUS_QUICKBLOG_DESC ; ?> </em>
< table id = " quickblog_table " style = " width: 50% " >
< tr >
< td nowrap = 'nowrap' >< ? php echo TITLE ; ?> </td>
< td >< input class = " input_textbox " name = " serendipity[quickblog][title] " type = " text " style = " width: 90% " /></ td >
</ tr >
< tr >
< td nowrap = 'nowrap' >< ? php echo ENTRY_BODY ; ?> </td>
< td >< textarea name = " serendipity[quickblog][body] " style = " width: 90%; height: 200px " ></ textarea ></ td >
</ tr >
< tr >
< td nowrap = 'nowrap' >< ? php echo CATEGORY ; ?> </td>
< td >< select name = " serendipity[quickblog][category] " >
< ? php
if ( is_array ( $cats = serendipity_fetchCategories ())) {
$cats = serendipity_walkRecursive ( $cats , 'categoryid' , 'parentid' , VIEWMODE_THREADED );
foreach ( $cats as $cat ) {
2012-06-05 15:08:46 +02:00
echo '<option value="' . $cat [ 'categoryid' ] . '"' . '>' . str_repeat ( ' ' , $cat [ 'depth' ]) . $cat [ 'category_name' ] . '</option>' . " \n " ;
2011-12-13 12:29:05 +01:00
}
}
?>
</ select >
</ td >
</ tr >
< tr >
< td nowrap = 'nowrap' >< ? php echo IMAGE_SIZE ; ?> </td>
< td >< input class = " input_textbox " name = " serendipity[quickblog][size] " value = " 640 " type = " text " style = " width: 50px " /></ td >
</ tr >
< tr >
< td align = " center " colspan = " 2 " >< br /></ td >
</ tr >
</ table >
< ? php
break ;
case 'backend_image_add' :
global $new_media ;
// if file is zip archive and unzipping enabled
// unzip file and add all images to database
// retrieve file type
$target_zip = $eventData ;
preg_match ( '@(^.*/)+(.*)\.+(\w*)@' , $target_zip , $matches );
$target_dir = $matches [ 1 ];
$basename = $matches [ 2 ];
$extension = $matches [ 3 ];
$authorid = ( isset ( $serendipity [ 'POST' ][ 'all_authors' ]) && $serendipity [ 'POST' ][ 'all_authors' ] == 'true' ) ? '0' : $serendipity [ 'authorid' ];
// only if unzipping function exists, we have archive file and unzipping set to yes
if (( class_exists ( 'ZipArchive' )) && ( $extension == 'zip' ) && ( $serendipity [ 'POST' ][ 'unzip_archives' ] == YES )) {
// now unzip
$zip = new ZipArchive ;
$res = $zip -> open ( $target_zip );
if ( $res === TRUE ) {
$files_to_unzip = array ();
$extracted_images = array ();
for ( $i = 0 ; $i < $zip -> numFiles ; $i ++ ) {
$file_to_extract = $zip -> getNameIndex ( $i );
if ( file_exists ( $target_dir . $file_to_extract )) {
echo '(' . $file_to_extract . ') ' . ERROR_FILE_EXISTS_ALREADY . '<br />' ;
} else {
$files_to_unzip [] = $file_to_extract ;
$extracted_images [] = $target_dir . $file_to_extract ;
}
}
$zip -> extractTo ( $target_dir , $files_to_unzip );
$zip -> close ();
echo PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_OK ;
} else {
echo PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_FAILED ;
}
// now proceed all unzipped images
foreach ( $extracted_images as $target ) {
preg_match ( '@(^.*/)+(.*)\.+(\w*)@' , $target , $matches );
$real_dir = $matches [ 1 ];
$basename = $matches [ 2 ];
$extension = $matches [ 3 ];
$tfile = $basename . " . " . $extension ;
preg_match ( '@' . $serendipity [ 'uploadPath' ] . '(.*/)@' , $target , $matches );
$image_directory = $matches [ 1 ];
// make thumbnails for new images
$thumbs = array ( array (
'thumbSize' => $serendipity [ 'thumbSize' ],
'thumb' => $serendipity [ 'thumbSuffix' ]
));
serendipity_plugin_api :: hook_event ( 'backend_media_makethumb' , $thumbs );
foreach ( $thumbs as $thumb ) {
// Create thumbnail
if ( $created_thumbnail = serendipity_makeThumbnail ( $tfile , $image_directory , $thumb [ 'thumbSize' ], $thumb [ 'thumb' ]) ) {
echo PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_IMAGE_FROM_ARCHIVE . " - " . THUMB_CREATED_DONE . '<br />' ;
}
}
// Insert into database
$image_id = serendipity_insertImageInDatabase ( $tfile , $image_directory , $authorid , null , $realname );
echo PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_IMAGE_FROM_ARCHIVE . " ( $tfile ) " . PLUGIN_EVENT_IMAGESELECTORPLUS_UNZIP_ADD_TO_DB . " <br /> " ;
$new_media [] = array (
'image_id' => $image_id ,
'target' => $target ,
'created_thumbnail' => $created_thumbnail
);
}
}
case 'backend_image_addHotlink' :
// Re-Scale thumbnails?
$max_scale = array (
'width' => ( int ) $this -> get_config ( 'thumb_max_width' ),
'height' => ( int ) $this -> get_config ( 'thumb_max_height' )
);
if ( $max_scale [ 'width' ] > 0 || $max_scale [ 'height' ] > 0 ) {
$this -> resizeThumb ( $max_scale , $eventData );
}
if ( empty ( $serendipity [ 'POST' ][ 'quickblog' ][ 'title' ])) {
break ;
}
$file = basename ( $eventData );
$directory = str_replace ( $serendipity [ 'serendipityPath' ] . $serendipity [ 'uploadPath' ], '' , dirname ( $eventData ) . '/' );
$size = ( int ) $serendipity [ 'POST' ][ 'quickblog' ][ 'size' ];
$oldSuffix = $serendipity [ 'thumbSuffix' ];
$serendipity [ 'thumbSuffix' ] = 'quickblog' ;
serendipity_makeThumbnail ( $file , $directory , $size );
$serendipity [ 'thumbSuffix' ] = $oldSuffix ;
//New draft post
$entry = array ();
$entry [ 'isdraft' ] = 'false' ;
$entry [ 'title' ] = $serendipity [ 'POST' ][ 'quickblog' ][ 'title' ];
$entry [ 'body' ] = '<!--quickblog:' . $eventData . '-->' . $serendipity [ 'POST' ][ 'quickblog' ][ 'body' ];
$entry [ 'authorid' ] = $serendipity [ 'authorid' ];
$entry [ 'exflag' ] = false ;
$entry [ 'categories' ][ 0 ] = $serendipity [ 'POST' ][ 'quickblog' ][ 'category' ];
$entry [ 'allow_comments' ] = 'true' ;
$entry [ 'moderate_comments' ] = 'false' ;
$serendipity [ 'POST' ][ 'properties' ][ 'fake' ] = 'fake' ;
$id = serendipity_updertEntry ( $entry );
break ;
case 'frontend_display' :
// auto resizing images based on width and/or height attributes in img tag
if ( serendipity_db_bool ( $this -> get_config ( 'autoresize' ))) {
if ( ! empty ( $eventData [ 'body' ])) {
$eventData [ 'body' ] = $this -> substituteImages ( $eventData [ 'body' ]);
}
if ( ! empty ( $eventData [ 'extended' ])) {
$eventData [ 'extended' ] = $this -> substituteImages ( $eventData [ 'extended' ]);
}
}
if ( empty ( $eventData [ 'body' ])) {
return ;
}
// displaying quickbox posts
if ( is_object ( $serendipity [ 'smarty' ]) && preg_match ( '@<!--quickblog:(.+)-->@imsU' , $eventData [ 'body' ], $filematch )) {
$eventData [ 'body' ] = $this -> parse_quickblog_post ( $filematch [ 1 ], $eventData [ 'body' ]);
}
// displaying galleries introduced by markup
foreach ( $this -> markup_elements as $temp ) {
if ( serendipity_db_bool ( $this -> get_config ( $temp [ 'name' ], true )) && isset ( $eventData [ $temp [ 'element' ]]) &&
! $eventData [ 'properties' ][ 'ep_disable_markup_' . $this -> instance ] &&
! isset ( $serendipity [ 'POST' ][ 'properties' ][ 'disable_markup_' . $this -> instance ])) {
$element = $temp [ 'element' ];
$eventData [ $element ] = $this -> media_insert ( $eventData [ $element ], $eventData );
}
}
return true ;
break ;
case 'backend_entry_presave' :
if ( is_numeric ( $eventData [ 'id' ])) {
$eventData [ 'body' ] = str_replace ( '{{s9yisp_entryid}}' , $eventData [ 'id' ], $eventData [ 'body' ]);
$eventData [ 'extended' ] = str_replace ( '{{s9yisp_entryid}}' , $eventData [ 'id' ], $eventData [ 'extended' ]);
$this -> gotMilk = true ;
} else {
$this -> cache [ 'body' ] = $eventData [ 'body' ];
$this -> cache [ 'extended' ] = $eventData [ 'extended' ];
}
break ;
case 'backend_publish' :
case 'backend_save' :
if ( $this -> gotMilk === false ) {
$old = md5 ( $this -> cache [ 'body' ]) . md5 ( $this -> cache [ 'extended' ]);
$this -> cache [ 'body' ] = str_replace ( '{{s9yisp_entryid}}' , $eventData [ 'id' ], $this -> cache [ 'body' ]);
$this -> cache [ 'extended' ] = str_replace ( '{{s9yisp_entryid}}' , $eventData [ 'id' ], $this -> cache [ 'extended' ]);
$new = md5 ( $this -> cache [ 'body' ]) . md5 ( $this -> cache [ 'extended' ]);
if ( $old != $new ) {
serendipity_db_query ( " UPDATE { $serendipity [ 'dbPrefix' ] } entries
SET body = '" . serendipity_db_escape_string($this->cache[' body ']) . "' ,
extended = '" . serendipity_db_escape_string($this->cache[' extended ']) . "'
WHERE id = " . (int) $eventData['id'] );
}
}
break ;
case 'entry_display' :
if ( $this -> selected ()) {
if ( is_array ( $eventData )) {
$eventData [ 'clean_page' ] = true ; // This is important to not display an entry list!
} else {
$eventData = array ( 'clean_page' => true );
}
}
break ;
case 'entries_header' :
if ( ! $this -> selected ()) {
return true ;
}
if ( ! headers_sent ()) {
header ( 'HTTP/1.0 200' );
header ( 'Status: 200 OK' );
}
$entry = serendipity_fetchEntry ( 'id' , $serendipity [ 'GET' ][ 'id' ]);
$imageid = $serendipity [ 'GET' ][ 'image' ];
$imgsrc = '' ;
if ( preg_match ( '@<a title="([^"]+)" id="s9yisp' . $imageid . '"></a>@imsU' , $entry [ 'body' ], $imgmatch )) {
$imgsrc = $imgmatch [ 1 ];
} elseif ( preg_match ( '@<a title="([^"]+)" id="s9yisp' . $imageid . '"></a>@imsU' , $entry [ 'extended' ], $imgmatch )) {
$imgsrc = $imgmatch [ 1 ];
} else {
return ;
}
$link = '<a href="' . serendipity_archiveURL ( $serendipity [ 'GET' ][ 'id' ], $entry [ 'title' ], 'baseURL' , true , array ( 'timestamp' => $entry [ 'timestamp' ])) . '#s9yisp' . $imageid . '">' ;
echo ' < div class = " serendipity_Entry_Date " >
< h3 class = " serendipity_date " > ' . serendipity_formatTime(DATE_FORMAT_ENTRY, $entry[' timestamp ']) . ' </ h3 > ' ;
echo '<h4 class="serendipity_title"><a href="#">' . htmlspecialchars ( $entry [ 'title' ]) . '</a></h4>' ;
echo '<div class="serendipity_entry"><div class="serendipity_entry_body">' ;
echo '<div class="serendipity_center">' . $link . '<img src="' . $imgsrc . '" /></a></div>' ;
echo '<br />' ;
echo $link . '<< ' . BACK . '</a>' ;
echo '</div></div></div>' ;
return true ;
break ;
case 'frontend_image_add_unknown' :
case 'frontend_image_add_filenameonly' :
case 'frontend_image_selector_submit' :
case 'frontend_image_selector_more' :
case 'frontend_image_selector_imagecomment' :
case 'frontend_image_selector_imagealign' :
case 'frontend_image_selector_imagesize' :
case 'frontend_image_selector_hiddenfields' :
return true ;
break ;
case 'frontend_image_selector_imagelink' :
$this -> display_target_selectbox ();
return true ;
break ;
case 'frontend_image_selector' :
$eventData [ 'finishJSFunction' ] = 'serendipity_imageSelectorPlus_done(\'' . $serendipity [ 'GET' ][ 'textarea' ] . '\')' ;
$this -> display_script ();
return true ;
break ;
default :
return false ;
}
} else {
return false ;
}
}
/*
* function parse_quickblog_post makes a quickblog post from the picture
* given by $path @ string
*/
function parse_quickblog_post ( $path , & $body ) {
global $serendipity ;
$file = basename ( $path );
$dir = dirname ( $path ) . '/' ;
$t = serendipity_parseFileName ( $file );
$f = $t [ 0 ];
$suf = $t [ 1 ];
$infile = $dir . $file ;
$outfile = $dir . $f . '.quickblog.' . $suf ;
if ( function_exists ( 'exif_read_data' ) && file_exists ( $infile ) && ! serendipity_db_bool ( $this -> get_config ( 'force_jhead' ))) {
$exif = exif_read_data ( $infile );
$exif_mode = 'internal' ;
} elseif ( file_exists ( $infile )) {
$exif_mode = 'jhead' ;
$exif_raw = explode ( " \n " , @ `jhead $infile` );
$exif = array ();
foreach (( array ) $exif_raw AS $line ) {
preg_match ( '@^(.+):(.+)$@U' , $line , $data );
$key = preg_replace ( '@[^a-z0-9]@i' , '_' , trim ( $data [ 1 ]));
if ( empty ( $key )) {
continue ;
}
$exif [ $key ] .= trim ( $data [ 2 ]) . " \n " ;
}
if ( count ( $exif ) < 1 ) {
$exif = false ;
}
} else {
$exif = false ;
$exif_mode = 'none' ;
}
$http_infile = $this -> httpize ( $infile );
$http_outfile = $this -> httpize ( $outfile );
$quickblog = array (
'image' => $http_outfile ,
'fullimage' => $http_infile ,
'body' => preg_replace ( '@(<!--quickblog:.+-->)@imsU' , '' , $body ),
'exif' => & $exif ,
'exif_mode' => $exif_mode
);
$tfile = serendipity_getTemplateFile ( 'quickblog.tpl' , 'serendipityPath' );
if ( ! $tfile || $tfile == 'quickblog.tpl' ) {
$tfile = dirname ( __FILE__ ) . '/quickblog.tpl' ;
}
$inclusion = $serendipity [ 'smarty' ] -> security_settings [ INCLUDE_ANY ];
$serendipity [ 'smarty' ] -> security_settings [ INCLUDE_ANY ] = true ;
$serendipity [ 'smarty' ] -> assign ( 'quickblog' , $quickblog );
$content = $serendipity [ 'smarty' ] -> fetch ( 'file:' . $tfile );
$serendipity [ 'smarty' ] -> security_settings [ INCLUDE_ANY ] = $inclusion ;
return $content ;
}
/*
* display_target_selectbox ()
* displays select box for choosing target of image in the image selector
* depreceated , in new version > 0.9 already in admin_image_selector . php
*/
function display_target_selectbox () {
?>
< label id = " select_image_target " >< ? php echo PLUGIN_EVENT_IMAGESELECTORPLUS_TARGET ; ?> </label>
< select name = " serendipity[target] " id = " select_image_target " >
< option value = " none " < ? php echo ifRemember ( 'target' , 'none' , false , 'selected' ); ?> ><?php echo NONE; ?></option>
< option value = " js " < ? php echo ifRemember ( 'target' , 'js' , false , 'selected' ); ?> ><?php echo PLUGIN_EVENT_IMAGESELECTORPLUS_TARGET_JS; ?></option>
< option value = " plugin " < ? php echo ifRemember ( 'target' , 'plugin' , false , 'selected' ); ?> ><?php echo PLUGIN_EVENT_IMAGESELECTORPLUS_TARGET_ENTRY; ?></option>
< option value = " _blank " < ? php echo ifRemember ( 'target' , '_blank' , false , 'selected' ); ?> ><?php echo PLUGIN_EVENT_IMAGESELECTORPLUS_TARGET_BLANK; ?></option>
</ select >
< br />
< ? php
}
/*
* display_sript ()
* displays script necessary for inserting target for images chosen by
* image selector
* depreceated , in new version > 0.9 already in admin_image_selector . php
*/
function display_script () {
?>
< script type = " text/javascript " >
function serendipity_imageSelectorPlus_done ( textarea )
{
var insert = '' ;
var img = '' ;
var src = '' ;
var f = document . forms [ 'serendipity[selForm]' ] . elements ;
if ( f [ 'serendipity[linkThumbnail]' ][ 0 ] . checked == true ) {
img = f [ 'thumbName' ] . value ;
imgWidth = f [ 'imgThumbWidth' ] . value ;
imgHeight = f [ 'imgThumbHeight' ] . value ;
} else {
img = f [ 'imgName' ] . value ;
imgWidth = f [ 'imgWidth' ] . value ;
imgHeight = f [ 'imgHeight' ] . value ;
}
if ( f [ 'serendipity[filename_only]' ] && f [ 'serendipity[filename_only]' ] . value == 'true' ) {
self . opener . serendipity_imageSelector_addToElement ( img , f [ 'serendipity[htmltarget]' ] . value );
self . close ();
return true ;
}
if ( document . getElementById ( 'serendipity_imagecomment' ) . value != '' ) {
styled = false ;
} else {
styled = true ;
}
floating = 'center' ;
if ( f [ 'serendipity[align]' ][ 0 ] . checked == true ) {
img = " <img width=' " + imgWidth + " ' height=' " + imgHeight + " ' " + ( styled ? 'style="border: 0px; padding-left: 5px; padding-right: 5px;"' : '' ) + ' src="' + img + " \" alt= \" \" /> " ;
} else if ( f [ 'serendipity[align]' ][ 1 ] . checked == true ) {
img = " <img width=' " + imgWidth + " ' height=' " + imgHeight + " ' " + ( styled ? 'style="float: left; border: 0px; padding-left: 5px; padding-right: 5px;"' : '' ) + ' src="' + img + " \" alt= \" \" /> " ;
floating = 'left' ;
} else if ( f [ 'serendipity[align]' ][ 2 ] . checked == true ) {
img = " <img width=' " + imgWidth + " ' height=' " + imgHeight + " ' " + ( styled ? 'style="float: right; border: 0px; padding-left: 5px; padding-right: 5px;"' : '' ) + ' src="' + img + " \" alt= \" \" /> " ;
floating = 'right' ;
}
if ( f [ 'serendipity[isLink]' ][ 1 ] . checked == true ) {
targetval = f [ 'serendipity[target]' ] . options [ f [ 'serendipity[target]' ] . selectedIndex ] . value ;
prepend = '' ;
ilink = f [ 'serendipity[url]' ] . value ;
if ( ! targetval || targetval == 'none' ) {
itarget = '' ;
} else if ( targetval == 'js' ) {
itarget = ' onclick="F1 = window.open(\'' + f [ 'serendipity[url]' ] . value + '\',\'Zoom\',\''
+ 'height=' + ( parseInt ( f [ 'imgHeight' ] . value ) + 15 ) + ','
+ 'width=' + ( parseInt ( f [ 'imgWidth' ] . value ) + 15 ) + ','
+ 'top=' + ( screen . height - f [ 'imgHeight' ] . value ) / 2 + ','
+ 'left=' + ( screen . width - f [ 'imgWidth' ] . value ) / 2 + ','
+ 'toolbar=no,menubar=no,location=no,resize=1,resizable=1,scrollbars=yes\'); return false;"' ;
} else if ( targetval == '_blank' ) {
itarget = ' target="_blank"' ;
} else if ( targetval == 'plugin' ) {
itarget = ' id="s9yisphref<?php echo $serendipity[' GET '][' image ']; ?>"' ;
prepend = '<a title="' + ilink + '" id="s9yisp<?php echo $serendipity[' GET '][' image ']; ?>"></a>' ;
ilink = '<?php echo $serendipity[' baseURL '] . $serendipity[' indexFile '] . ' ? serendipity [ subpage ] = s9yisp & amp ; serendipity [ id ] = {{ s9yisp_entryid }} & amp ; serendipity [ image ] = ' . $serendipity[' GET '][' image ']; ?>' ;
}
insert = prepend + " <a class='serendipity_image_link' href=' " + ilink + " ' " + itarget + " > " + img + " </a> " ;
} else {
insert = img ;
}
if ( document . getElementById ( 'serendipity_imagecomment' ) . value != '' ) {
comment = f [ 'serendipity[imagecomment]' ] . value ;
block = '<div class="serendipity_imageComment_' + floating + '" style="width: ' + imgWidth + 'px">'
+ '<div class="serendipity_imageComment_img">' + insert + '</div>'
+ '<div class="serendipity_imageComment_txt">' + comment + '</div>'
+ '</div>' ;
} else {
block = insert ;
}
if ( self . opener . editorref ) {
self . opener . editorref . surroundHTML ( block , '' );
} else {
self . opener . serendipity_imageSelector_addToBody ( block , textarea );
}
self . close ();
}
</ script >
< ? php
}
/*
* media_insert
* this function replaces xml - like structure in the $text @ string
* by images from media gallery
*/
function media_insert ( $text , & $eventData ) {
global $serendipity ;
// find in text parts which are mediainsert
$entry_parts = preg_split ( '@(<mediainsert>[\S\s]*?</mediainsert>)@' , $text , - 1 , PREG_SPLIT_DELIM_CAPTURE );
// parse mediainserts
// (if xml parser is present at php installation
// - SimpleXMLElement in PHP > 5.0, users of older version could have troubles )
// text is splitted into parts
if ( class_exists ( 'SimpleXMLElement' )) {
for ( $i = 0 , $pcount = count ( $entry_parts ); $i < $pcount ; $i ++ ) {
if ( ! ( strpos ( $entry_parts [ $i ], " <mediainsert> " ) === false )) {
$xml = new SimpleXMLElement ( $entry_parts [ $i ]);
$gallery = $xml -> gallery [ 'name' ];
$medias = array ();
$whole_gallery = false ;
foreach ( $xml -> media as $medium ) {
switch (( string ) $medium [ 'type' ]) { // Get attributes as element indices
case 'single' :
$medias [] = serendipity_db_escape_string ( $medium [ 'name' ]);
break ;
case 'range' :
for ( $j = intval ( $medium [ 'start' ]); $j <= intval ( $medium [ 'stop' ]); $j ++ ) {
$medias [] = serendipity_db_escape_string ( $medium [ 'prefix' ]) . $j ;
}
break ;
case 'gallery' :
$whole_gallery = true ;
break ;
default :
break ;
}
}
// here we have desired gallery and desired pictures
// now read available ones from database
if ( $whole_gallery ) {
$q = " SELECT id,name,extension,thumbnail_name,realname,path,value as comment1,dimensions_width as width, dimensions_height as height
FROM { $serendipity [ 'dbPrefix' ]} images as i
LEFT JOIN { $serendipity [ 'dbPrefix' ]} mediaproperties as p ON ( p . mediaid = i . id AND p . property = 'COMMENT1' )
WHERE i . path = '" . serendipity_db_escape_string($gallery) . "' " ;
} else {
$images_suggestions = " ' " . implode ( " ',' " , $medias ) . " ' " ;
$q = " SELECT id,name,extension,thumbnail_name,realname,path,value as comment1,dimensions_width as width, dimensions_height as height
FROM { $serendipity [ 'dbPrefix' ]} images as i
LEFT JOIN { $serendipity [ 'dbPrefix' ]} mediaproperties as p ON ( p . mediaid = i . id AND p . property = 'COMMENT1' )
WHERE i . path = '" . serendipity_db_escape_string($gallery) . "' AND i . name IN ( $images_suggestions ) " ;
}
$t = serendipity_db_query ( $q );
// here we have to order the results from database to respect
// the order of pictures in xml entry
// and at the same time we calculate thumbs size
$thumb_size = $serendipity [ 'thumbSize' ];
$order = array ();
if ( is_array ( $t )) {
for ( $j = 0 , $tcount = count ( $t ) ; $j < $tcount ; $j ++ ) {
$h = intval ( $t [ $j ][ " height " ]);
$w = intval ( $t [ $j ][ " width " ]);
if ( $w > $h ) {
$t [ $j ][ " thumbheight " ] = round ( $thumb_size * $h / $w );
$t [ $j ][ " thumbwidth " ] = round ( $thumb_size );
} else {
$t [ $j ][ " thumbheight " ] = round ( $thumb_size );
$t [ $j ][ " thumbwidth " ] = round ( $thumb_size * $w / $h );
}
if ( strlen ( $t [ $j ][ " comment1 " ]) == 0 ) {
$t [ $j ][ " comment1 " ] = $t [ $j ][ " name " ];
}
$order [ $j ] = array_search ( $t [ $j ][ " name " ], $medias );
if ( strlen ( $t [ $j ][ " thumbnail_name " ]) == 0 ) {
array_splice ( $t , $j , 1 );
$j -- ;
$tcount -- ;
}
}
array_multisort ( $order , SORT_ASC , SORT_NUMERIC , $t );
// now make an output using template
$tfile = serendipity_getTemplateFile ( 'plugin_mediainsert.tpl' , 'serendipityPath' );
if ( ! $tfile || $tfile == 'plugin_mediainsert.tpl' ) {
$tfile = dirname ( __FILE__ ) . '/plugin_mediainsert.tpl' ;
}
$inclusion = $serendipity [ 'smarty' ] -> security_settings [ INCLUDE_ANY ];
$serendipity [ 'smarty' ] -> security_settings [ INCLUDE_ANY ] = true ;
$serendipity [ 'smarty' ] -> assign ( 'plugin_mediainsert_media' , $t );
$serendipity [ 'smarty' ] -> assign ( 'plugin_mediainsert_entry' , $eventData );
$content = $serendipity [ 'smarty' ] -> fetch ( 'file:' . $tfile );
$serendipity [ 'smarty' ] -> security_settings [ INCLUDE_ANY ] = $inclusion ;
} else {
// if there are no available images, do no output
$content = " " ;
}
// fetch the output
$entry_parts [ $i ] = $content ;
}
}
}
return implode ( " " , $entry_parts );
}
//////////////////////////////////////////////////////////////
/// The following methods are used for the auto image resizing
/**
* Substitute img src attributes in $html with auto resize urls
*
* @ author Adam Charnock ( http :// omniwiki . co . uk )
* @ param string $html
* @ return string The HTML with the transformed images
*/
function substituteImages ( $html ) {
$imgTags = $this -> getImageTags ( $html );
//We need to make sure we substitute the last images first otherwise
//our char offsets will get messed up
$imgTags = array_reverse ( $imgTags );
foreach ( $imgTags as $attrs ) {
$newTag = '<img' ;
$attrPairs = array ();
foreach ( $attrs as $k => $v ) {
if ( strpos ( $k , '_' ) !== 0 ) {
if ( $k == 'src' ) {
$v = $this -> getTransformImg ( $attrs );
}
$quote = ( strpos ( $v , '"' ) !== false ) ? " ' " : '"' ;
$attrPairs [] = " $k = $quote $v $quote " ;
}
}
$newTag .= ' ' . implode ( ' ' , $attrPairs ) . ' />' ;
//Now we need to splice the new tag into the HTML
$firstHalf = substr ( $html , 0 , $attrs [ '_offset' ]);
$secondHalf = substr ( $html , $attrs [ '_offset' ] + $attrs [ '_length' ]);
$html = $firstHalf . $newTag . $secondHalf ;
}
return $html ;
}
/**
* Gets an image ID based on the URL
*
* The URL can be in the form :
*
* < maybe - something - here >/ uploads / fireworks . jpg
* or
* < maybe - something - here >/ templates_c / mediacache / cache_img1_300_300
*
* The first example will cause the database to be queried . In the second
* example the image ID will be extracted directly from the URL
*
* @ param string The image URL
* @ return mixed An image ID if the URL could be matched , or false if the URL could not be matched
*/
function getImageIdByUrl ( $url ){
global $serendipity ;
if ( preg_match ( '#.*templates_c/mediacache/cache_img(\d+)_(\d*)_(\d*)#i' , $url , $m )) {
$imageId = $m [ 1 ];
} else if ( preg_match ( '#.*uploads(.*/)([^/]+)\.([a-z0-9]+)#i' , $url , $m )) {
$name = serendipity_db_escape_string ( $m [ 2 ]);
$extension = serendipity_db_escape_string ( $m [ 3 ]);
$path = serendipity_db_escape_string ( ltrim ( $m [ 1 ], '/' ));
$sql = " SELECT id FROM { $serendipity [ 'dbPrefix' ] } images WHERE name = '%s' AND extension = '%s' AND path = '%s' " ;
$sql = sprintf ( $sql , $name , $extension , $path );
$row = serendipity_db_query ( $sql , true );
$imageId = $row [ 'id' ];
} else {
//We got an unrecognised url so return false
$imageId = false ;
}
return $imageId ;
}
/**
* Get the transformed src for an img tag
*
* @ author Adam Charnock ( http :// omniwiki . co . uk )
* @ param array $attrs An associative array of the image ' s attributes . Must conatain src , and either width or height
* @ return unknown
*/
function getTransformImg ( $attrs ) {
global $serendipity ;
/*
Image URLs can be expected to look like either :
< maybe - something - here >/ uploads / fireworks . jpg
or
< maybe - something - here >/ templates_c / mediacache / cache_img1_300_300
*/
if ( ! isset ( $attrs [ 'src' ]) || ! $attrs [ 'src' ]) {
trigger_error ( 'The $attrs parameter must contain a "src" key' , E_USER_ERROR );
}
if (( ! isset ( $attrs [ 'height' ]) || ! $attrs [ 'height' ]) && ( ! isset ( $attrs [ 'width' ]) || ! $attrs [ 'width' ])) {
//Without any height or width values we cannot do anything
return $attrs [ 'src' ];
}
$url = $attrs [ 'src' ];
$imageId = $this -> getImageIdByUrl ( $url );
if ( ! $imageId ) {
//We got an unrecognised url so don't do anything to it, just send it right back
return $url ;
}
//Create the new, transformed URL
$newUrl = rtrim ( $serendipity [ 'baseURL' ], '/' ) . '/serendipity_admin_image_selector.php?serendipity[image]=%d&serendipity[disposition]=inline&serendipity[step]=showItem' ;
if ( isset ( $attrs [ 'height' ]) && $attrs [ 'height' ]) {
$newUrl .= '&serendipity[resizeHeight]=' . ( int )( $attrs [ 'height' ]);
}
if ( isset ( $attrs [ 'width' ]) && $attrs [ 'width' ]) {
$newUrl .= '&serendipity[resizeWidth]=' . ( int )( $attrs [ 'width' ]);
}
$newUrl = sprintf ( $newUrl , $imageId );
return $newUrl ;
}
/**
* Parses image tags out of a chunk of HTML
*
* @ author Adam Charnock ( http :// omniwiki . co . uk )
* @ param string $html
* @ return array An array of image tags . Each tag is an associative array of its attributes , plus _offset and _length
*/
function getImageTags ( $html ) {
//Thanks to the following blog post for the inspiration for this regex:
//http://kev.coolcavemen.com/2007/03/ultimate-regular-expression-for-html-tag-parsing-with-php/
preg_match_all ( " /< \ /?( \ w+)(( \ s+ \ w+( \ s*= \ s*(?: \" .*? \" |'.*?'|[^' \" > \ s]+))?)+ \ s*| \ s*) \ /?>/i " , $html , $m , PREG_OFFSET_CAPTURE );
$tags = array ( 'types' => $m [ 1 ], 'attrs' => $m [ 2 ], 'wholetags' => $m [ 0 ]);
//At this stage $tags['attrs'] is just an unparsed string
$imgTags = array ();
for ( $i = 0 ; $i < count ( $tags [ 'attrs' ]); $i ++ ) {
if ( $tags [ 'types' ][ $i ][ 0 ] == 'img' ) {
$parsedAttrs = $this -> parseAttrs ( $tags [ 'attrs' ][ $i ][ 0 ]);
if ( isset ( $parsedAttrs [ 'src' ])) {
$parsedAttrs [ '_offset' ] = $tags [ 'wholetags' ][ $i ][ 1 ];
$parsedAttrs [ '_length' ] = strlen ( $tags [ 'wholetags' ][ $i ][ 0 ]);
$imgTags [] = $parsedAttrs ;
}
}
}
return $imgTags ;
}
/**
* Parse the attribute portion of an HTML / XHTML / XML tag
*
* The $atts param should ( or rather , can ) look something like :
* width = " 400 " height = '300' border = 0 alt = " This is an example! "
*
* Which will produce an array as follows :
*
* < pre >
* array ( 4 ) {
* [ " width " ] =>
* string ( 3 ) " 400 "
* [ " height " ] =>
* string ( 5 ) " 300 "
* [ " border " ] =>
* string ( 1 ) " 0 "
* [ " alt " ] =>
* string ( 19 ) " This is an example! "
* }
* </ pre >
*
* @ author Adam Charnock ( http :// omniwiki . co . uk )
* @ internal It may be possible to do this with a regex
* @ param string $attrs The tag string
* @ return array An associative array of attributes
*/
function parseAttrs ( $attrs ) {
$parsedAttrs = array ();
$currentAttrName = '' ;
$currentAttrValue = '' ;
//We append an extra space to ensure the last attr gets processd
$chars = str_split ( $attrs . ' ' , 1 );
$state = 'read-name' ;
$quote = '' ;
foreach ( $chars as $c ) {
switch ( $state ){
case 'read-name' :
if ( $c == ' ' && ! $currentAttrName ){
break ;
}
if ( $c == '=' || $c == ' ' ) {
$state = 'read-value-start' ;
} else {
$currentAttrName .= $c ;
}
break ;
case 'read-value-start' :
if ( $c == '"' || $c == " ' " ) {
$quote = $c ;
} else {
$quote = '' ;
$currentAttrValue .= $c ;
}
$state = 'read-value' ;
break ;
case 'read-value' :
if ( in_array ( $c , array ( ' ' , '/' , '>' )) && ! $quote ) {
$state = 'read-value-finished' ;
} else if ( $c == $quote ) {
$state = 'read-value-finished' ;
} else {
$currentAttrValue .= $c ;
}
break ;
case 'read-value-finished' :
$parsedAttrs [ $currentAttrName ] = $currentAttrValue ;
$currentAttrName = ( $c == ' ' ) ? '' : $c ;
$currentAttrValue = '' ;
$state = 'read-name' ;
break ;
}
}
return $parsedAttrs ;
}
}
/* vim: set sts=4 ts=4 expandtab : */