This commit is contained in:
Garvin Hicking 2009-04-16 16:47:51 +00:00
parent 98d1eefdae
commit ececb2d98c
4 changed files with 52 additions and 1 deletions

View File

@ -4,7 +4,7 @@ Version 1.5 ()
------------------------------------------------------------------------
* Enhance xhtml cleanup plugin to also work on <param value="..." />
tags. (garvinhicking)
tags and fix youtube html. (garvinhicking)
* Changed bookmarklet to work with Chrome, thanks to Oliver
Gassner & TextPattern :-) (garvinhicking)

View File

@ -893,6 +893,8 @@ function serendipity_insertComment($id, $commentInfo, $type = 'NORMAL', $source
if ($GLOBALS['tb_logging']) {
fclose($fp);
}
return $cid;
}
/**

View File

@ -12,5 +12,7 @@
@define('PLUGIN_EVENT_XHTMLCLEANUP_XHTML_DESC', 'This plugin uses a XML parsing method to ensure XHTML validity of your code. This xml parsing may convert already valid entities to unescaped entities, so the plugin encodes all entities after the parsing. Set this flag to OFF if that introduces double encoding for you!');
@define('PLUGIN_EVENT_XHTMLCLEANUP_UTF8', 'Cleanup UTF-8 entities?');
@define('PLUGIN_EVENT_XHTMLCLEANUP_UTF8_DESC', 'If enabled, HTML entities derived from UTF-8 characters will be properly converted and not double-encoded in your output.');
@define('PLUGIN_EVENT_XHTMLCLEANUP_YOUTUBE', 'Cleanup Youtube player code?');
@define('PLUGIN_EVENT_XHTMLCLEANUP_YOUTUBE_DESC', 'If enabled, the by default XHTML invalid youtube object tags will get stripped of the embed part. Browser will still properly playback the video.');
?>

View File

@ -71,6 +71,7 @@ class serendipity_event_xhtmlcleanup extends serendipity_event
}
$conf_array[] = 'xhtml_parse';
$conf_array[] = 'utf8_parse';
$conf_array[] = 'youtube';
$propbag->add('configuration', $conf_array);
}
@ -99,6 +100,11 @@ class serendipity_event_xhtmlcleanup extends serendipity_event
$propbag->add('name', PLUGIN_EVENT_XHTMLCLEANUP_XHTML);
$propbag->add('description', PLUGIN_EVENT_XHTMLCLEANUP_XHTML_DESC);
$propbag->add('default', 'true');
} elseif ($name == 'youtube') {
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_XHTMLCLEANUP_YOUTUBE);
$propbag->add('description', PLUGIN_EVENT_XHTMLCLEANUP_YOUTUBE_DESC);
$propbag->add('default', 'true');
} else {
$propbag->add('type', 'boolean');
$propbag->add('name', constant($name));
@ -122,6 +128,11 @@ class serendipity_event_xhtmlcleanup extends serendipity_event
'title',
'author',
);
static $youtube = null;
if ($youtube === null) {
$youtube = serendipity_db_bool($this->get_config('youtube'));
}
$hooks = &$bag->get('event_hooks');
if (isset($hooks[$event])) {
@ -149,6 +160,10 @@ class serendipity_event_xhtmlcleanup extends serendipity_event
$eventData[$element] = xhtml_cleanup($eventData[$element]);
$eventData[$element] = preg_replace_callback('@(<img.+/?>)@imsU', array($this, 'clean_tag'), $eventData[$element]);
$eventData[$element] = preg_replace_callback("@<(a|iframe|param)(.*)(href|src|value)=(\"|')([^\"']+)(\"|')@isUm", array($this, 'clean_htmlspecialchars'), $eventData[$element]);
if ($youtube) {
$this->youtubify($eventData[$element]);
}
}
}
@ -178,6 +193,38 @@ class serendipity_event_xhtmlcleanup extends serendipity_event
}
}
function youtubify(&$text) {
$text = preg_replace_callback('@<object(.*)>(.*)</object>@imsU', array($this, 'youtubify_regex'), $text);
}
function youtubify_regex($matches) {
if (!preg_match('@<embed@i', $matches[2])) return $matches[0];
preg_match('@width=["\']?([0-9]+)@ims', $matches[1], $m);
$width = $m[1];
preg_match('@height=["\']?([0-9]+)@ims', $matches[1], $m);
$height = $m[1];
preg_match('@<param name="movie" value="(.+)"[\s/]*?>@imsU', $matches[2], $m);
$movie = $m[1];
if (empty($movie)) {
preg_match('@<param value="(.+)" name="movie"[\s/]*?>@imsU', $matches[2], $m);
$movie = $m[1];
}
$appendix = preg_replace('@<embed.*>@imsU', '', $matches[2]);
$appendix = str_replace('</embed>', '', $appendix);
$out = '<!-- xhtml clean youtube --><object type="application/x-shockwave-flash" width="' . $width . '" height="' . $height . '" data="' . $movie . '">'
. '<param name="movie" value="' . $movie . '" />'
. $appendix . '</object><!-- /xhtml clean youtube -->';
$out .= "\n\n<!-- {$matches[0]} -->\n\n";
return $out;
}
// Takes an input tag and search for ommitted attributes. Expects a single tag (array, index 0)
function clean_tag($data) {
// Restore tags from preg_replace_callback buffer, as those can't be passed in the function header