diff --git a/jw_player.module b/jw_player.module
index ba4c197..2ade65b 100644
--- a/jw_player.module
+++ b/jw_player.module
@@ -1022,137 +1022,6 @@ function jw_player_supports($file) {
}
/**
- * Implements hook_filter_info().
- */
-function jw_player_filter_info() {
- $filters = array();
- $filters['jw_player_shortcode'] = array(
- 'title' => t('JW Player Filter'),
- 'description' => t('Substitutes [jwplayer] shortcode markup with an embedded media file.'),
- 'process callback' => 'jw_player_jw_player_shortcode_process',
- 'tips callback' => 'jw_player_jw_player_shortcode_tips',
- 'weight' => 0,
- );
- return $filters;
-}
-
-/**
- * Helper function to provide on screen tips for using the filter.
- *
- * @return string
- * String to be displayed within input filter tips.
- */
-function jw_player_jw_player_shortcode_tips($filter, $format, $long = FALSE) {
- return t('You may insert media with [jwplayer] shortcode markup. Available parameters include: file (required), image, preset (machine name), image_style (machine name), width, height. Example: [jwplayer|file=http://site.com/video.mp4|preset=my_preset_settings]');
-}
-
-/**
- * Callback function to perform the content processing.
- *
- * @param string $text
- * Text to be processed by input filter.
- *
- * @return string
- * Modified text where shortcodes have been replaced by rendered elements.
- */
-function jw_player_jw_player_shortcode_process($text, $filter, $format, $langcode, $cache, $cache_id) {
- // Detect JW Player shortcode in the context.
- $regex = '/(\[(\
|\s)*jwplayer(\
|\s)*(\|([a-zA-Z0-9_.\s]+=[-a-zA-Z0-9+.,\(\){}:&@#\/\?<>\"%=~_\'\"\s]+))*(\
|\s)*\])/';
- preg_match_all($regex, $text, $matches);
- $shortcodes = $matches[0];
- if (!empty($shortcodes)) {
- foreach ($shortcodes as $shortcode) {
- $element = _jw_player_filter_prepare_player($shortcode);
- if (!$element) {
- continue;
- }
-
- // Get the markup for this player.
- $new_markup = render($element);
-
- // Replace the original shortcode with the markup.
- $text = str_replace($shortcode, $new_markup, $text);
- }
- }
- return $text;
-}
-
-/**
- * Prepares a render array for theme_jw_player_player().
- *
- * It is similar to jw_player_field_formatter_view()
- * with modifications for inline shortcodes.
- *
- * @param string $shortcode
- * A shortcode string.
- *
- * @return array $element
- * A renderable array element.
- *
- * @see jw_player_field_formatter_view()
- */
-function _jw_player_filter_prepare_player($shortcode) {
- $shortcode = str_replace('
', '', $shortcode);
- $shortcode = preg_replace('/\[(\s)*jwplayer(\s)*(\||\])/', '', $shortcode);
- $shortcode = str_replace(']', '', $shortcode);
- $args = preg_split('/\|/', $shortcode);
- // Validate and add parameters.
- $item = array();
- foreach ($args as $fvar) {
- $key_val = preg_split('/=/', $fvar, 2);
- // Build element as long as keys are not empty.
- if (!empty($key_val[0])) {
- $key_val[0] = trim($key_val[0]);
- // Strip out damaging auto link filter.
- $key_val[1] = trim(preg_replace('/<(.)*>/U', '', $key_val[1]));
- switch ($key_val[0]) {
- case 'file':
- case 'image':
- case 'preset':
- case 'image_style':
- $item[$key_val[0]] = $key_val[1];
- break;
- default:
- $item['option'][$key_val[0]] = $key_val[1];
- break;
- }
- }
- }
- // Only render if a file exists.
- $element = array();
- if (isset($item['file'])) {
- $element = array(
- '#type' => 'jw_player',
- '#player_type' => 'player',
- '#theme' => 'jw_player_player',
- '#preset' => isset($item['preset']) ? $item['preset'] : '',
- '#image_style' => isset($item['image_style']) ? $item['image_style'] : '',
- '#files' => array(
- array(
- 'file' => $item['file'],
- 'image' => isset($item['image']) ? $item['image'] : '',
- ),
- ),
- );
- if (isset($item['option'])) {
- foreach ($item['option'] as $key => $value) {
- $element['#options'][$key] = $value;
- }
- }
-
- // Build #html_id based on url, player type, and preset.
- $items[0]['url'] = $item['file'];
- $settings = array(
- 'player_type' => $element['#player_type'],
- 'jwplayer_preset' => $element['#preset'],
- );
- $element['#html_id'] = jw_player_build_player_id($items, $settings);
- }
-
- return $element;
-}
-
-/**
* Checks whether a legacy version is configured.
*
* @return bool
diff --git a/jw_player_filter/README.txt b/jw_player_filter/README.txt
new file mode 100644
index 0000000..a59f666
--- /dev/null
+++ b/jw_player_filter/README.txt
@@ -0,0 +1,83 @@
+JW Player Filter module.
+
+SUMMARY
+-----------------------------------------------
+The JW Player Filter module is an add-on for the JW Player module. The filter
+can be included in Drupal text formats to convert shortcode markup into
+embedded JW Player media players. This allows content contributors to add
+video and audio files inline in nodes and other entities, and have the final
+result render as a JW Player.
+
+
+REQUIREMENTS
+-----------------------------------------------
+* This module requires the JW Player module to be installed.
+
+
+INSTALLATION
+-----------------------------------------------
+* Install the module via drush or the site's Modules page (admin/modules).
+
+
+BASIC USAGE
+-----------------------------------------------
+The site administrator needs to configure the filter similar to other text
+format filters. Navigate to the Text formats page (admin/config/content/formats),
+select the text format to configure, and enable "JW Player Filter".
+
+It is important to set the JW Player Filter to be fairly early in the
+filter processing order (low weight), otherwise other filters will cause the
+JW Player to not render correctly.
+
+Once the filter has been applied to a text format, content can be created
+or edited to include embedded JW Player players inline. This is done using
+the [jwplayer] shortcode markup.
+
+Shortcode markup is a specially formatted text that the filter identifies
+as having JW Player parameters, and converts the codes into an embedded player.
+The shortcode always starts with a left bracket and 'jwplayer' (no quotes), and
+ends with a right bracket.
+
+In between the "[jwplayer" and "]" are a list of parameters, each separated by
+a vertical bar. The possible parameters are:
+
+* file = URL of the media file to be rendered (required).
+* image = URL of the preview image to be shown before playback starts.
+* preset = machine name of the JW Player preset created in Drupal.
+* image_style = machine name of the Drupal image style to be applied to the
+ preview image.
+* width = player width in pixels.
+* height = player height in pixels.
+
+Only "file" is a required parameter. All others are optional. There should be
+no spaces between vertical tabs, and no spaces within any parameter.
+
+
+EXAMPLES
+-----------------------------------------------
+Below are examples of how to use the JW Player filter shortcode markup:
+
+* Display a video called "my-video.mp4" using a preset with name of "My Preset"
+ (machine name is "my_preset"):
+
+ [jwplayer|file=http://mysite.com/my-video.mp4|preset=my_preset]
+
+* Display a video called "news_video.mp4", with a preview image named
+ "news_clip.jpg", image style named "16 by 9" (machine name of "16_by_9"),
+ and preset named "16x9 - 100% width" (machine name of "16x9_100_width"):
+
+ [jwplayer|file=http://mysite.com/sites/default/files/video/news_video.mp4|image=http://mysite.com/sites/default/files/image/news_clip.jpg|image_style=16_by_9|preset=16x9_100_width]
+
+* Display an audio file called "todays-podcast.mp3", with a player that has
+ a width of 400 pixels and a height of 33 pixels:
+
+ [jwplayer|file=http://mysite.com/todays-podcast.mp3|width=400|height=33]
+
+
+LIMITATIONS
+-----------------------------------------------
+1) For JW Player Filter to work correctly, it is necessary to disable filter
+ caching. This causes a performance hit on any page where the filter is used.
+ It is highly recommended to create a separate text format specifically for
+ embedding inline JW Player players. This will ensure site caching is not
+ disabled on pages where no players are present.
diff --git a/jw_player_filter/jw_player_filter.info b/jw_player_filter/jw_player_filter.info
new file mode 100644
index 0000000..62ccf46
--- /dev/null
+++ b/jw_player_filter/jw_player_filter.info
@@ -0,0 +1,4 @@
+name = JW Player Filter
+description = Substitute shortcode markup with an embedded media file in JW Player.
+core = 7.x
+dependencies[] = jw_player
diff --git a/jw_player_filter/jw_player_filter.install b/jw_player_filter/jw_player_filter.install
new file mode 100644
index 0000000..eb38132
--- /dev/null
+++ b/jw_player_filter/jw_player_filter.install
@@ -0,0 +1,6 @@
+ t('JW Player Filter'),
+ 'description' => t('Substitutes [jwplayer] shortcode markup with an embedded media file.'),
+ 'process callback' => 'jw_player_jw_player_shortcode_process',
+ 'tips callback' => 'jw_player_jw_player_shortcode_tips',
+ 'cache' => FALSE,
+ 'weight' => 0,
+ );
+ return $filters;
+}
+
+/**
+ * Helper function to provide on screen tips for using the filter.
+ *
+ * @return string
+ * String to be displayed within input filter tips.
+ */
+function jw_player_jw_player_shortcode_tips($filter, $format, $long = FALSE) {
+ return t('You may insert media with [jwplayer] shortcode markup. Available parameters include: file, image, preset, image_style, width, and height. A value for file is required, and preset and image_style must be machine names. No quotes should be included. Example: [jwplayer|file=http://site.com/video.mp4|preset=my_preset_settings]');
+}
+
+/**
+ * Callback function to perform the content processing.
+ *
+ * @param string $text
+ * Text to be processed by input filter.
+ *
+ * @return string
+ * Modified text where shortcodes have been replaced by rendered elements.
+ */
+function jw_player_jw_player_shortcode_process($text, $filter, $format, $langcode, $cache, $cache_id) {
+ // Detect JW Player shortcode in the context.
+ $regex = '/(\[(\
|\s)*jwplayer(\
|\s)*(\|([a-zA-Z0-9_.\s]+=[-a-zA-Z0-9+.,\(\){}:&@#\/\?<>\"%=~_\'\"\s]+))*(\
|\s)*\])/';
+ preg_match_all($regex, $text, $matches);
+ $shortcodes = $matches[0];
+ if (!empty($shortcodes)) {
+ foreach ($shortcodes as $shortcode) {
+ $element = _jw_player_filter_prepare_player($shortcode);
+ if (!$element) {
+ continue;
+ }
+
+ // Get the markup for this player.
+ $new_markup = render($element);
+
+ // Replace the original shortcode with the markup.
+ $text = str_replace($shortcode, $new_markup, $text);
+ }
+ }
+ return $text;
+}
+
+/**
+ * Prepares a render array for theme_jw_player_player().
+ *
+ * It is similar to jw_player_field_formatter_view()
+ * with modifications for inline shortcodes.
+ *
+ * @param string $shortcode
+ * A shortcode string.
+ *
+ * @return array $element
+ * A renderable array element.
+ *
+ * @see jw_player_field_formatter_view()
+ */
+function _jw_player_filter_prepare_player($shortcode) {
+ $shortcode = str_replace('
', '', $shortcode);
+ $shortcode = preg_replace('/\[(\s)*jwplayer(\s)*(\||\])/', '', $shortcode);
+ $shortcode = str_replace(']', '', $shortcode);
+ $args = preg_split('/\|/', $shortcode);
+ // Validate and add parameters.
+ $item = array();
+ foreach ($args as $fvar) {
+ $key_val = preg_split('/=/', $fvar, 2);
+ // Build element as long as keys are not empty.
+ if (!empty($key_val[0])) {
+ $key_val[0] = trim($key_val[0]);
+ // Strip out damaging auto link filter.
+ $key_val[1] = trim(preg_replace('/<(.)*>/U', '', $key_val[1]));
+ switch ($key_val[0]) {
+ case 'file':
+ case 'image':
+ case 'preset':
+ case 'image_style':
+ $item[$key_val[0]] = $key_val[1];
+ break;
+ default:
+ $item['option'][$key_val[0]] = $key_val[1];
+ break;
+ }
+ }
+ }
+ // Only render if a file exists.
+ $element = array();
+ if (isset($item['file'])) {
+ $element = array(
+ '#type' => 'jw_player',
+ '#player_type' => 'player',
+ '#theme' => 'jw_player_player',
+ '#preset' => isset($item['preset']) ? $item['preset'] : '',
+ '#image_style' => isset($item['image_style']) ? $item['image_style'] : '',
+ '#files' => array(
+ array(
+ 'file' => $item['file'],
+ 'image' => isset($item['image']) ? $item['image'] : '',
+ ),
+ ),
+ );
+ if (isset($item['option'])) {
+ foreach ($item['option'] as $key => $value) {
+ $element['#options'][$key] = $value;
+ }
+ }
+
+ // Build #html_id based on url, player type, and preset.
+ $items[0]['url'] = $item['file'];
+ $settings = array(
+ 'player_type' => $element['#player_type'],
+ 'jwplayer_preset' => $element['#preset'],
+ );
+ $element['#html_id'] = jw_player_build_player_id($items, $settings);
+ }
+
+ return $element;
+}