From MediaWiki.org
<?php
// Copyright 2006 by Dallan Quass
// Released under the GPL.
// Modified 5-Dec-07 by Matt Collinge (www.mattcollinge.co.uk) to allow wiki tags within notes
require_once("$IP/includes/Image.php");
class Fotonotes {
var $img;
/**
* Construct a new Fotonotes object
*/
function __construct($title) {
$this->img = new Image($title);
}
function Fotonotes($title) {
$this->img = new Image($title);
}
// Extracted from ImagePage.openShowImage
function getShowImageParameters() {
global $wgUser, $wgImageLimits, $wgUseImageResize, $wgGenerateThumbnailOnParse;
$url = ''; $width = 0; $height = 0;
if( $wgUser->getOption( 'imagesize' ) == '' ) {
$sizeSel = User::getDefaultOption( 'imagesize' );
} else {
$sizeSel = intval( $wgUser->getOption( 'imagesize' ) );
}
if( !isset( $wgImageLimits[$sizeSel] ) ) {
$sizeSel = User::getDefaultOption( 'imagesize' );
}
$max = $wgImageLimits[$sizeSel];
$maxWidth = $max[0];
$maxHeight = $max[1];
if ( $this->img->exists() ) {
# image
$width = $this->img->getWidth();
$height = $this->img->getHeight();
if ( $this->img->allowInlineDisplay() and $width and $height) {
# image
# We'll show a thumbnail of this image
if ( $width > $maxWidth || $height > $maxHeight ) {
# Calculate the thumbnail size.
# First case, the limiting factor is the width, not the height.
if ( $width / $height >= $maxWidth / $maxHeight ) {
$height = round( $height * $maxWidth / $width);
$width = $maxWidth;
# Note that $height <= $maxHeight now.
} else {
$newwidth = floor( $width * $maxHeight / $height);
$height = round( $height * $newwidth / $width );
$width = $newwidth;
# Note that $height <= $maxHeight now, but might not be identical
# because of rounding.
}
if( $wgUseImageResize ) {
$thumbnail = $this->img->getThumbnail( $width, -1, $wgGenerateThumbnailOnParse );
if ( $thumbnail == null ) {
$url = $this->img->getViewURL();
} else {
$url = $thumbnail->getURL();
}
} else {
# No resize ability? Show the full image, but scale
# it down in the browser so it fits on the page.
$url = $this->img->getViewURL();
}
} else {
$url = $this->img->getViewURL();
}
}
}
return array($url, $width, $height);
}
/**
* Render the DIV containing the image notes
* @param $notes pass in a string or a simplexml object
*/
function renderImageNotes($notes, $divID = 'fn-default-notes') {
$result = '';
if ($this->img && $this->img->exists()) {
$height = $this->img->getHeight();
$width = $this->img->getWidth();
if ($height && $width) {
$result .= "<div id=\"$divID\" style=\"display:none\" title=\"$height:$width\">\n";
if (is_string($notes)) {
//$pattern = "#<note\s+left=\"(\d+)\"\s+top=\"(\d+)\"\s+right=\"(\d+)\"\s+bottom=\"(\d+)\"\s+title=\"([^\"]*)\">([^<]*)</note>#i"; // MattC 5-Dec-07 Allows HTML formatting & lets the routine match a note containing HTML
$pattern = "#<note\s+left=\"(\d+)\"\s+top=\"(\d+)\"\s+right=\"(\d+)\"\s+bottom=\"(\d+)\"\s+title=\"([^\"]*)\">(.*)</note>#i";
$matches = array();
preg_match_all($pattern, $notes, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$title = htmlspecialchars($match[5]);
//$content = htmlspecialchars($match[6]); //MattC 5-Dec-07 Allows HTML formatting
$content = $match[6];
$result .= "<span style=\"left:{$match[1]}px; top:{$match[2]}px; right:{$match[3]}px; bottom:{$match[4]}px;\" title=\"$title\">$content</span>\n";
}
}
else {
foreach ($notes as $note) {
$title = htmlspecialchars((string)$note['title']);
$content = htmlspecialchars((string)$note);
$result .= "<span style=\"left:{$note['left']}px; top:{$note['top']}px; right:{$note['right']}px; bottom:{$note['bottom']}px;\" title=\"$title\">$content</span>\n";
}
}
$result .= "</div>";
}
}
return $result;
}
/**
* Render an editable IMG and the DIV containing the image notes
* @param $notes pass in a string or a simplexml object
*/
function renderEditableImage($notes) {
global $wgScriptPath;
$result = '';
if ($this->img && $this->img->exists()) {
list($url, $width, $height) = $this->getShowImageParameters();
if ($height && $width) {
$result .= "<img id=\"fn-editable\" class=\"fn-image fn-editable\" border=\"0\" src=\"{$url}\" width=\"{$width}\" height=\"{$height}\" />"
.$this->renderImageNotes($notes, 'fn-editable-notes')
."<script type=\"text/javascript\" src=\"$wgScriptPath/fnclientwiki.js\"></script>";
}
}
return $result;
}
}