/**
* Function to try a few tricks to determine the displayed size of an img on the page.
* NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types.
*
* Future enhancement:
* Look in the tag to see if there is a class or id specified that has a height or width attribute to it.
*
* Far future enhancement
* Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width
* Note that in this case, the class or id will have the img sub-selector for it to apply to the image.
*
* ridiculously far future development
* If the class or id is specified in a SEPARATE css file that's not on the page, go get it and do what we were just doing for the ones on the page.
*
* @author John Schlick
* @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out.
*/
public function get_display_size()
{
$width = -1;
$height = -1;
if ($this->tag->name() != 'img') {
return false;
}
// See if there is a height or width attribute in the tag itself.
if (!is_null($this->tag->getAttribute('width'))) {
$width = $this->tag->getAttribute('width');
}
if (!is_null($this->tag->getAttribute('height'))) {
$height = $this->tag->getAttribute('height');
}
// Now look for an inline style.
if (!is_null($this->tag->getAttribute('style'))) {
// Thanks to user 'gnarf' from stackoverflow for this regular expression.
$attributes = [];
preg_match_all("/([\\w-]+)\\s*:\\s*([^;]+)\\s*;?/", $this->tag->getAttribute('style'), $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$attributes[$match[1]] = $match[2];
}
// If there is a width in the style attributes:
if (isset($attributes['width']) and $width == -1) {
// check that the last two characters are px (pixels)
if (strtolower(substr($attributes['width'], -2)) == 'px') {
$proposed_width = substr($attributes['width'], 0, -2);
// Now make sure that it's an integer and not something stupid.
if (filter_var($proposed_width, FILTER_VALIDATE_INT)) {
$width = $proposed_width;
}
}
}
// If there is a width in the style attributes:
if (isset($attributes['height']) and $height == -1) {
// check that the last two characters are px (pixels)
if (strtolower(substr($attributes['height'], -2)) == 'px') {
$proposed_height = substr($attributes['height'], 0, -2);
// Now make sure that it's an integer and not something stupid.
if (filter_var($proposed_height, FILTER_VALIDATE_INT)) {
$height = $proposed_height;
}
}
}
}
$result = ['height' => $height, 'width' => $width];
return $result;
}