t('Embedded Inline Media'));
case 'description':
switch ($delta) {
case 0:
return t('Embed videos from specified URL.');
default:
return;
}
case "process":
switch ($delta) {
case 0:
return _eminline_url($text, $format);
default:
return;
}
case 'settings':
switch ($delta) {
case 0:
return _eminline_url_settings($format);
default:
return;
}
default:
return $text;
}
}
/**
* Implementation of hook_filter_tips().
*/
function eminline_filter_tips($delta, $format, $long = FALSE) {
$output = '';
switch ($delta) {
case '0':
$providers = variable_get('eminline_providers_' . $format, array_keys(emfield_system_list('emvideo', NULL, FALSE)));
$output .= t('You may embed videos from the following providers %providers. Just add the video URL to your textarea in the place where you would like the video to appear, i.e. http://www.youtube.com/watch?v=pw0jmvdh.', array('%providers' => implode(', ', array_filter($providers))));
}
return $output;
}
/**
* Match all http(s) URLs and pass to link checker.
*
* @param string $text
* The contents of the text area.
* @param int $format
* The format id.
*
* @return string
*/
function _eminline_url($text, $format) {
$text = ' '. $text .' ';
// Need to attach the variables to the callback after the regex.
$callback = _eminline_curry('_eminline_url_parse_full_links', 2);
// Match absolute URLs.
$text = preg_replace_callback("`(
|
|
|[ \n\r\t\(])((http://|https://)([a-zA-Z0-9@:%_+*~#?&=.,/;-]*[a-zA-Z0-9@:%_+*~#&=/;-]))([.,?!]*?)(?=(||
|[ \n\r\t\)]))`i", $callback($format), $text);
return $text;
}
/**
* If one of our allowed providers knows what to do with the url,
* then let it embed the video.
*
* @param int $format
* The format id.
* @param array $match
* The matched text from our regex.
*
* @return string
* The replacement text for the url.
*/
function _eminline_url_parse_full_links($format, $match) {
// Get just the URL.
$match[2] = check_url(decode_entities($match[2]));
// Get our filter settings.
$video_default = variable_get('eminline_video_' . $format, _eminline_default_filter_settings('video'));
$preview_default = variable_get('eminline_preview_' . $format, _eminline_default_filter_settings('preview'));
$tn_default = variable_get('eminline_tn_' . $format, _eminline_default_filter_settings('tn'));
// Build a fake field, remember that emfield is well a field.
$field = array(
'field_name' => 'eminline',
'type' => 'emvideo',
'video_width' => $video_default['video_width'],
'video_height' => $video_default['video_height'],
'video_autoplay' => $video_default['video_autoplay'],
'preview_width' => $preview_default['preview_width'],
'preview_height' => $preview_default['preview_height'],
'preview_autoplay' => $preview_default['preview_autoplay'],
'thumbnail_width' => $tn_default['thumbnail_width'],
'thumbnail_height' => $tn_default['thumbnail_height'],
'thumbnail_default_path' => $tn_default['thumbnail_default_path'],
'providers' => variable_get('eminline_providers_' . $format, array_keys(emfield_system_list('emvideo', NULL, FALSE))),
);
// Build our embed item.
$item = emfield_parse_embed($field, $match[2], 'emvideo');
// Check to make sure the provider that was found is an allowed provider.
if ($field['providers'][$item['provider']]) {
$item['data'] = (array)emfield_include_invoke('emvideo', $item['provider'], 'data', $field, $item);
}
else {
return $match[0];
}
// Get how the video should be displayed.
$display_format = variable_get('eminline_full_node_' . $format, 'video_video');
// Change the options based on how the video should be displayed.
if ($display_format == 'video_thumbnail') {
$options = array(
'width' => $field['thumbnail_width'],
'height' => $field['thumbnail_height'],
'default_path' => $field['thumbnail_default_path'],
);
}
else if ($display_format == 'video_preview') {
$options = array(
'width' => $field['preview_width'],
'height' => $field['preview_height'],
'autoplay' => $field['preview_autoplay'],
);
}
else {
$options = array(
'width' => $field['video_width'],
'height' => $field['video_height'],
'autoplay' => $field['video_autoplay'],
);
}
// Theme the video w00t!
return theme('eminline_url_wrapper', emfield_emfield_field_formatter($field, $item, $display_format, NULL, 'emvideo', $options));
}
/**
* Settings form for filter.
*
* @param int format
* The format id.
*
* @return array
*/
function _eminline_url_settings($format) {
$form['format'] = array(
'#type' => 'value',
'#value' => $format,
);
// Get the settings that are avaliable to the cck widget.
$form['eminline_'. $format] = emvideo_widget_settings('form', array('type' => 'emvideo_textfields'));
$form['eminline_'. $format]['provider_list']['providers']['#default_value'] = variable_get('eminline_providers_' . $format, array_keys($form['eminline_'. $format]['provider_list']['providers']['#options']));
$video_default = variable_get('eminline_video_' . $format, _eminline_default_filter_settings('video'));
foreach ($video_default as $key => $value) {
$form['eminline_'. $format]['video'][$key]['#default_value'] = $value;
}
$preview_default = variable_get('eminline_preview_' . $format, _eminline_default_filter_settings('preview'));
foreach ($preview_default as $key => $value) {
$form['eminline_'. $format]['preview'][$key]['#default_value'] = $value;
}
$tn_default = variable_get('eminline_tn_' . $format, _eminline_default_filter_settings('tn'));
foreach ($tn_default as $key => $value) {
$form['eminline_'. $format]['tn'][$key]['#default_value'] = $value;
}
// Add select for choosing display format.
$form['eminline_'. $format]['node_display'] = array(
'#type' => 'select',
'#title' => t('Video display in node view'),
'#default_value' => variable_get('eminline_full_node_' . $format, 'video_video'),
'#options' => array(
'video_video' => t('Video'),
'video_preview' => t('Preview'),
'video_thumbnail' => t('Thumbnail'),
),
'#weight' => -999
);
$form['eminline_'. $format]['#type'] = 'fieldset';
$form['eminline_'. $format]['#title'] = t('Embed inline');
$form['eminline_'. $format]['#collapsible'] = TRUE;
$form['eminline_'. $format]['#tree'] = TRUE;
return $form;
}
/**
* Implementation of hook_form_FORM_ID_alter().
*
* Because filter format forms are merged, any common keys need to be added in
* a form_alter. Otherwise, e.g. submit handlers added by one module would be
* overwritten by those of another module.
*/
function eminline_form_filter_admin_configure_alter(&$form, $form_state) {
if (isset($form['format']) && isset($form['eminline_' . $form['format']['#value']])) {
$form['#validate'][] = '_eminline_url_settings_form_validate';
// Add the submit callback to the beginning of the array because we need
// to prepare data for system_settings_form_submit().
array_unshift($form['#submit'], '_eminline_url_settings_form_submit');
}
}
/*
TODO Write validation function...
*/
function _eminline_url_settings_form_validate($form, &$form_state) {
$format = $form_state['values']['format'];
if (!is_numeric($form_state['values']['eminline_'. $format]['video']['video_width'])
|| intval($form_state['values']['eminline_'. $format]['video']['video_width']) != $form_state['values']['eminline_'. $format]['video']['video_width']
|| $form_state['values']['eminline_'. $format]['video']['video_width'] < 1) {
form_set_error('eminline_'. $format .'][video][video_width', t('"Video width" must be a positive integer.'));
}
if (!is_numeric($form_state['values']['eminline_'. $format]['video']['video_height'])
|| intval($form_state['values']['eminline_'. $format]['video']['video_height']) != $form_state['values']['eminline_'. $format]['video']['video_height']
|| $form_state['values']['eminline_'. $format]['video']['video_height'] < 1) {
form_set_error('eminline_'. $format .'][video][video_height', t('"Video height" must be a positive integer.'));
}
if (!is_numeric($form_state['values']['eminline_'. $format]['preview']['preview_width'])
|| intval($form_state['values']['eminline_'. $format]['preview']['preview_width']) != $form_state['values']['eminline_'. $format]['preview']['preview_width']
|| $form_state['values']['eminline_'. $format]['preview']['preview_width'] < 1) {
form_set_error('eminline_'. $format .'][preview][preview_width', t('"Preview width" must be a positive integer.'));
}
if (!is_numeric( $form_state['values']['eminline_'. $format]['preview']['preview_height'])
|| intval( $form_state['values']['eminline_'. $format]['preview']['preview_height']) != $form_state['values']['eminline_'. $format]['preview']['preview_height']
|| $form_state['values']['eminline_'. $format]['preview']['preview_height'] < 1) {
form_set_error('eminline_'. $format .'][preview][preview_height', t('"Preview height" must be a positive integer.'));
}
if (!is_numeric($form_state['values']['eminline_'. $format]['tn']['thumbnail_height'])
|| intval($form_state['values']['eminline_'. $format]['tn']['thumbnail_height']) != $form_state['values']['eminline_'. $format]['tn']['thumbnail_height']
|| $form_state['values']['eminline_'. $format]['tn']['thumbnail_height'] < 1) {
form_set_error('eminline_'. $format .'][tn][thumbnail_height', t('"Thumbnail height" must be a positive integer.'));
}
if (!is_numeric($form_state['values']['eminline_'. $format]['tn']['thumbnail_width'])
|| intval($form_state['values']['eminline_'. $format]['tn']['thumbnail_width']) != $form_state['values']['eminline_'. $format]['tn']['thumbnail_width']
|| $form_state['values']['eminline_'. $format]['tn']['thumbnail_width'] < 1) {
form_set_error('eminline_'. $format .'][tn][thumbnail_width', t('"Thumbnail width" must be a positive integer.'));
}
}
function _eminline_url_settings_form_submit($form, &$form_state) {
$format = $form_state['values']['format'];
variable_set('eminline_providers_' . $format, $form_state['values']['eminline_'. $format]['provider_list']['providers']);
variable_set('eminline_video_' . $format, $form_state['values']['eminline_'. $format]['video']);
variable_set('eminline_preview_' . $format, $form_state['values']['eminline_'. $format]['preview']);
variable_set('eminline_tn_' . $format, $form_state['values']['eminline_'. $format]['tn']);
variable_set('eminline_full_node_' . $format, $form_state['values']['eminline_'. $format]['node_display']);
}
function _eminline_curry($func, $arity) {
return create_function('', "
\$args = func_get_args();
if(count(\$args) >= $arity)
return call_user_func_array('$func', \$args);
\$args = var_export(\$args, 1);
return create_function('','
\$a = func_get_args();
\$z = ' . \$args . ';
\$a = array_merge(\$z,\$a);
return call_user_func_array(\'$func\', \$a);
');
");
}
function _eminline_default_filter_settings($type = 'video') {
$return = array();
$widget = emvideo_widget_settings('form', array('type' => 'emvideo_textfields'));
if (is_array($widget[$type])) {
foreach(element_children($widget[$type]) as $key) {
$return[$key] = $widget[$type][$key][$default_value];
}
}
return $return;
}
/**
* Implement hook_theme().
*/
function eminline_theme($existing, $type, $theme, $path) {
return array(
'eminline_url_wrapper' => array(
'arguments' => array('content' => NULL),
),
);
}
/**
* Create additional theme layer.
*
* @param string $content
*
* @return string
*/
function theme_eminline_url_wrapper($content) {
$output = '';
$output .= '';
$output .= $content;
$output .= '
';
return $output;
}