From f60656b738c72752aa11a9f7529d167ad9e0137a Mon Sep 17 00:00:00 2001 From: John Bintz Date: Tue, 6 Oct 2009 22:26:31 -0400 Subject: [PATCH] dynamic filter addition through ninja skills --- classes/WDTSDisplayFilters.inc | 139 +++++++++++++++ classes/WhatDidTheySayAdmin.inc | 253 ++++++++++----------------- classes/partials/_default-styles.inc | 13 ++ what-did-they-say.pot | 25 ++- 4 files changed, 266 insertions(+), 164 deletions(-) create mode 100644 classes/WDTSDisplayFilters.inc diff --git a/classes/WDTSDisplayFilters.inc b/classes/WDTSDisplayFilters.inc new file mode 100644 index 0000000..250866d --- /dev/null +++ b/classes/WDTSDisplayFilters.inc @@ -0,0 +1,139 @@ + + + ' . $content . ''); + } + + /** + * Handle the_language_name filter. + * @param string $language The name of the language. + * @return string The processed language name. + */ + function the_language_name($language, $content = "") { + return array($language, '

' . sprintf(apply_filters('the_transcript_format_string'), $language) . '

'); + } + + /** + * Handle showing the header above a bundle of live transcripts. + */ + function the_transcript_language_name($language_format, $code, $content) { + if (is_null($language_format)) { $language_format = apply_filters('the_transcript_format_string', ''); } + + $language_options = new WDTSLanguageOptions(); + + return array($language_format, $code, '

' . sprintf($language_format, $language_options->get_language_name($code)) . '

'); + } + + /** + * The format string used to display ither a single or multiple language transcript header. + */ + function the_transcript_format_string($content) { + return __('Transcript: %s', 'what-did-they-say'); + } + + /** + * The script.aculo.us effects to use when fancy effects are enabled. + */ + function the_transcript_transition_effect($is_opening = true, $content) { + if ($is_opening) { + return array(true, "function(t) { new Effect.BlindDown(t, { duration: 0.25 }); }"); + } else { + return array(false, "function(t) { new Effect.BlindUp(t, { duration: 0.25 }); }"); + } + } + + /** + * Handle the_matching_transcript_excerpts. + */ + function the_matching_transcript_excerpts($transcripts, $search_string = '', $content = "") { + $options = get_option('what-did-they-say-options'); + ob_start(); + if ($options['search_integration']) { + if (!empty($search_string)) { + $language_options = new WDTSLanguageOptions(); + $options = get_option('what-did-they-say-options'); + + foreach ($transcripts as $transcript) { + if (($pos = strpos($transcript['transcript'], $search_string)) !== false) { + $l = strlen($transcript['transcript']) - 1; + echo '
'; + echo '

' . sprintf(__("%s transcript excerpt:", 'what-did-they-say'), $language_options->get_language_name($transcript['language'])) . '

'; + echo '

'; + $start_ellipsis = $end_ellipsis = true; + foreach (array( + 'start' => -1, + 'end' => 1 + ) as $variable => $direction) { + ${$variable} = $pos + ($options['excerpt_distance'] * $direction); + + if ($variable == "end") { ${$variable} += strlen($search_string); } + + if (${$variable} < 0) { ${$variable} = 0; $start_ellipsis = false; } + if (${$variable} > $l) { ${$variable} = $l; $end_ellipsis = false; } + } + + $output = ""; + if ($start_ellipsis) { $output .= "..."; } + $output .= str_replace($search_string, "" . $search_string . "", trim(substr($transcript['transcript'], $start, $end - $start))); + if ($end_ellipsis) { $output .= "..."; } + + echo $output; + echo '

'; + echo '
'; + } + } + } + } + return array($transcripts, $search_string, ob_get_clean()); + } + + /** + * Filter for dialog short code. + */ + function filter_shortcode_dialog($name, $direction, $speech, $content) { + $content = '
' . $name . ''; + if (!empty($direction)) { + $content .= ' ' . $direction . ''; + } + $content .= ' ' . $speech . '
'; + + return array($name, $direction, $speech, $content); + } + + /** + * Filter for scene heading short code. + */ + function filter_shortcode_scene_heading($description, $content) { + return array($description, '
' . $description . '
'); + } + + /** + * Filter for scene action short code. + */ + function filter_shortcode_scene_action($description, $content) { + return array($description, '
' . $description . '
', ); + } +} + +?> \ No newline at end of file diff --git a/classes/WhatDidTheySayAdmin.inc b/classes/WhatDidTheySayAdmin.inc index 40fd528..9de0f13 100644 --- a/classes/WhatDidTheySayAdmin.inc +++ b/classes/WhatDidTheySayAdmin.inc @@ -7,10 +7,7 @@ class WhatDidTheySayAdmin { var $default_options = array( 'languages' => array( array('code' => 'en', 'default' => true), - 'fr', - 'es', - 'it', - 'de' + 'fr', 'es', 'it', 'de' ), 'capabilities' => array( 'submit_transcriptions' => 'administrator', @@ -28,7 +25,8 @@ class WhatDidTheySayAdmin { 'single' => false ), 'transcript_effects' => false, - 'allow_html' => false + 'allow_html' => false, + 'filters_to_use' => 'simple' ); var $capabilities = array(); @@ -36,6 +34,7 @@ class WhatDidTheySayAdmin { var $language_file; var $all_languages = array(); var $notices = array(); + var $override_filter_info = false; var $is_ajax = false; @@ -46,6 +45,10 @@ class WhatDidTheySayAdmin { function WhatDidTheySayAdmin() { $this->language_file = dirname(__FILE__) . '/../data/lsr-language.txt'; } + + // just in case things need to be unit tested... + function get_filters_dir() { return WP_CONTENT_DIR . '/transcript-filters'; } + function _get_abspath() { return ABSPATH; } /** * Initialize the object. @@ -81,13 +84,52 @@ class WhatDidTheySayAdmin { add_filter('user_has_cap', array(&$this, 'user_has_cap'), 5, 3); // display effects - add_filter('the_media_transcript', array(&$this, 'the_media_transcript'), 10, 2); - add_filter('the_language_name', array(&$this, 'the_language_name'), 10, 2); - add_filter('the_matching_transcript_excerpts', array(&$this, 'the_matching_transcript_excerpts'), 10, 3); - add_filter('the_transcript_language_name', array(&$this, 'the_transcript_language_name'), 10, 3); - add_filter('the_transcript_format_string', array(&$this, 'the_transcript_format_string')); - add_filter('the_transcript_opener', array(&$this, 'the_transcript_opener')); - add_filter('the_transcript_transition_effect', array(&$this, 'the_transcript_transition_effect'), 10, 2); + $filters = new WDTSDisplayFilters(); + $reset_filter_value = true; + + if (is_string($options['filters_to_use'])) { + $target = $this->get_filters_dir() . '/' . preg_replace('#[^a-z0-9_-]#', '', strtolower($options['filters_to_use'])); + if (is_dir($target)) { + $this->override_filter_info = array(); + foreach (glob($target . '/*') as $file) { + if (preg_match('#\.(php|inc)$#', $file) > 0) { $this->override_filter_info['php'] = $file; } + if (preg_match('#\.(css)$#', $file) > 0) { $this->override_filter_info['css'] = $file; } + } + + if (isset($this->override_filter_info['php'])) { + $class_name = preg_replace('#\..*$#', '', basename($this->override_filter_info['php'])); + require_once($this->override_filter_info['php']); + + if (class_exists($class_name)) { + $filters = new $class_name(); + $reset_filter_value = false; + } + } + } + } + + if ($reset_filter_value) { + // $options['filters_to_use'] = false; + } + + foreach (array( + array('the_media_transcript', 2), + array('the_language_name', 2), + array('the_matching_transcript_excerpts', 3), + array('the_transcript_language_name', 3), + array('the_transcript_format_string', 1), + array('the_transcript_opener', 1), + array('the_transcript_transition_effect', 2), + array('filter_shortcode_dialog', 4), + array('filter_shortcode_scene_action', 2), + array('filter_shortcode_scene_heading', 2) + ) as $filter_info) { + list($method, $parameters) = $filter_info; + + if (method_exists($filters, $method)) { + add_filter($method, array(&$filters, $method), 10, $parameters); + } + } // short codes foreach (get_class_methods($this) as $method) { @@ -97,10 +139,6 @@ class WhatDidTheySayAdmin { } } - add_filter('filter_shortcode_dialog', array(&$this, 'filter_shortcode_dialog'), 10, 4); - add_filter('filter_shortcode_scene_action', array(&$this, 'filter_shortcode_scene_action'), 10, 2); - add_filter('filter_shortcode_scene_heading', array(&$this, 'filter_shortcode_scene_heading'), 10, 2); - // search transcripts, too? if ($options['search_integration']) { add_filter('posts_where', array(&$this, 'posts_where')); @@ -165,6 +203,10 @@ class WhatDidTheySayAdmin { wp_enqueue_style('wdts-defaults', plugin_dir_url(dirname(__FILE__)) . 'css/wdts-defaults.css'); } + if (isset($this->override_filter_info['css'])) { + wp_enqueue_style('wdts-override', str_replace(realpath($this->_get_abspath()), '', realpath($this->override_filter_info['css']))); + } + if ($options['transcript_effects']) { wp_enqueue_script('scriptaculous-effects'); } @@ -237,6 +279,10 @@ class WhatDidTheySayAdmin { wp_enqueue_style('wdts-admin', plugin_dir_url(dirname(__FILE__)) . 'css/wdts-admin.css'); wp_enqueue_style('wdts-defaults', plugin_dir_url(dirname(__FILE__)) . 'css/wdts-defaults.css'); + if (isset($this->override_filter_info['css'])) { + wp_enqueue_style('wdts-override', str_replace(realpath($this->_get_abspath()), '', realpath($this->override_filter_info['css']))); + } + wp_enqueue_script('scriptaculous-effects'); wp_enqueue_script('edit-transcripts', plugin_dir_url(dirname(__FILE__)) . 'js/edit-transcripts.js', array('scriptaculous-effects', 'wdts-script')); } @@ -255,113 +301,6 @@ class WhatDidTheySayAdmin { return $content . ob_get_clean(); } - /** - * Build the opener/closer for transcripts. - */ - function the_transcript_opener($content = '') { - ob_start(); ?> - - ' . $content . ''); - } - - /** - * Handle the_language_name filter. - * @param string $language The name of the language. - * @return string The processed language name. - */ - function the_language_name($language, $content = "") { - return array($language, '

' . sprintf(apply_filters('the_transcript_format_string'), $language) . '

'); - } - - /** - * Handle showing the header above a bundle of live transcripts. - */ - function the_transcript_language_name($language_format, $code, $content) { - if (is_null($language_format)) { $language_format = apply_filters('the_transcript_format_string', ''); } - - $language_options = new WDTSLanguageOptions(); - - return array($language_format, $code, '

' . sprintf($language_format, $language_options->get_language_name($code)) . '

'); - } - - /** - * The format string used to display ither a single or multiple language transcript header. - */ - function the_transcript_format_string($content) { - return __('Transcript: %s', 'what-did-they-say'); - } - - /** - * The script.aculo.us effects to use when fancy effects are enabled. - */ - function the_transcript_transition_effect($is_opening = true, $content) { - if ($is_opening) { - return array(true, "function(t) { new Effect.BlindDown(t, { duration: 0.25 }); }"); - } else { - return array(false, "function(t) { new Effect.BlindUp(t, { duration: 0.25 }); }"); - } - } - - /** - * Handle the_matching_transcript_excerpts. - */ - function the_matching_transcript_excerpts($transcripts, $search_string = '', $content = "") { - $options = get_option('what-did-they-say-options'); - ob_start(); - if ($options['search_integration']) { - if (!empty($search_string)) { - $language_options = new WDTSLanguageOptions(); - $options = get_option('what-did-they-say-options'); - - foreach ($transcripts as $transcript) { - if (($pos = strpos($transcript['transcript'], $search_string)) !== false) { - $l = strlen($transcript['transcript']) - 1; - echo '
'; - echo '

' . sprintf(__("%s transcript excerpt:", 'what-did-they-say'), $language_options->get_language_name($transcript['language'])) . '

'; - echo '

'; - $start_ellipsis = $end_ellipsis = true; - foreach (array( - 'start' => -1, - 'end' => 1 - ) as $variable => $direction) { - ${$variable} = $pos + ($options['excerpt_distance'] * $direction); - - if ($variable == "end") { ${$variable} += strlen($search_string); } - - if (${$variable} < 0) { ${$variable} = 0; $start_ellipsis = false; } - if (${$variable} > $l) { ${$variable} = $l; $end_ellipsis = false; } - } - - $output = ""; - if ($start_ellipsis) { $output .= "..."; } - $output .= str_replace($search_string, "" . $search_string . "", trim(substr($transcript['transcript'], $start, $end - $start))); - if ($end_ellipsis) { $output .= "..."; } - - echo $output; - echo '

'; - echo '
'; - } - } - } - } - return array($transcripts, $search_string, ob_get_clean()); - } - /** Transcript Search Filters **/ @@ -400,7 +339,8 @@ class WhatDidTheySayAdmin { return $join; } - /** Short codes and their filters **/ + + /** Short codes **/ /** * Dialog short code. @@ -414,19 +354,6 @@ class WhatDidTheySayAdmin { return end(apply_filters('filter_shortcode_dialog', $name, $direction, $speech, "")); } - /** - * Filter for dialog short code. - */ - function filter_shortcode_dialog($name, $direction, $speech, $content) { - $content = '
' . $name . ''; - if (!empty($direction)) { - $content .= ' ' . $direction . ''; - } - $content .= ' ' . $speech . '
'; - - return array($name, $direction, $speech, $content); - } - /** * Scene action short code. */ @@ -436,13 +363,6 @@ class WhatDidTheySayAdmin { return end(apply_filters('filter_shortcode_scene_action', $description, "")); } - /** - * Filter for scene action short code. - */ - function filter_shortcode_scene_action($description, $content) { - return array($description, '
' . $description . '
', ); - } - /** * Scene heading short code. */ @@ -452,13 +372,6 @@ class WhatDidTheySayAdmin { return end(apply_filters('filter_shortcode_scene_heading', $description, "")); } - /** - * Filter for scene heading short code. - */ - function filter_shortcode_scene_heading($description, $content) { - return array($description, '
' . $description . '
'); - } - /** Capabilities **/ @@ -696,10 +609,16 @@ class WhatDidTheySayAdmin { if (current_user_can('edit_themes')) { $options = get_option('what-did-they-say-options'); - foreach (array('load_default_styles', 'use_nl2br', 'transcript_effects') as $field) { - $options[$field] = isset($info[$field]); + foreach (array('load_default_styles', 'use_nl2br', 'transcript_effects', 'allow_html') as $field) { $options[$field] = isset($info[$field]); } + $options['excerpt_distance'] = !empty($info['excerpt_distance']) ? $info['excerpt_distance'] : 30; + foreach (array_keys($options['hide_transcript']) as $type) { + $options['hide_transcript'][$type] = isset($info['hide_transcript'][$type]); } - + + if (isset($info['filters_to_use'])) { + $options['filters_to_use'] = preg_replace('#[^a-z0-9_-]#', '', strtolower($info['filters_to_use'])); + } + update_option('what-did-they-say-options', $options); $updated = __('Default styles option updated.', 'what-did-they-say'); } @@ -875,6 +794,24 @@ class WhatDidTheySayAdmin { /** What Did They Say?!? administration screens **/ + function _get_available_override_filters() { + $available_filters = array(); + if (is_dir($this->get_filters_dir())) { + foreach (glob($this->get_filters_dir() . '/*') as $dir) { + if (is_dir($dir)) { + if (basename($dir) == preg_replace('#[^a-z0-9_-]#', '', strtolower(basename($dir)))) { + foreach (glob($dir . '/*') as $file) { + if (preg_match('#^(.*)\.(inc|php)$#', basename($file), $matches) > 0) { + $available_filters[] = basename($dir); + } + } + } + } + } + } + return $available_filters; + } + /** * Show the admin page. */ @@ -884,10 +821,12 @@ class WhatDidTheySayAdmin { $options = get_option('what-did-they-say-options'); $nonce = wp_create_nonce('what-did-they-say'); - $transcript_count = (int)$wpdb->get_var($wpdb->prepare("SELECT count($wpdb->postmeta.meta_key) FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = 'approved_transcripts'")); - - $suggested_amount = 20 + ($transcript_count * 0.1); + $transcript_count = (int)$wpdb->get_var($wpdb->prepare("SELECT count($wpdb->postmeta.meta_key) FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = 'approved_transcripts'")); + $suggested_amount = 20 + ($transcript_count * 0.1); + + $available_filters = $this->_get_available_override_filters(); + include('partials/admin.inc'); } diff --git a/classes/partials/_default-styles.inc b/classes/partials/_default-styles.inc index 9aa02b7..1b11c30 100644 --- a/classes/partials/_default-styles.inc +++ b/classes/partials/_default-styles.inc @@ -63,6 +63,19 @@ + + + + + diff --git a/what-did-they-say.pot b/what-did-they-say.pot index 3181cc3..dbe63d7 100644 --- a/what-did-they-say.pot +++ b/what-did-they-say.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: what-did-they-say 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-06 07:01-0400\n" +"POT-Creation-Date: 2009-10-06 07:11-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -196,13 +196,20 @@ msgid "" msgstr "" #: classes/partials/_default-styles.inc:36 -msgid "Turn transcript line breaks into HTML new lines (nl2br())" +msgid "" +"Turn transcript line breaks into HTML new lines (uses nl2br())" msgstr "" #: classes/partials/_default-styles.inc:44 msgid "" -"Allow HTML in transcripts. If disabled, only short codes are allowed. Script " -"and style tags are always filtered out." +"Allow HTML in transcripts. If disabled, only short codes are allowed, which " +"is recommended. Script, style, and link tags are " +"always filtered out." +msgstr "" + +#: classes/partials/_default-styles.inc:47 +msgid "By default, transcripts should start hidden on these types of pages:" msgstr "" #: classes/partials/_default-styles.inc:55 @@ -472,8 +479,8 @@ msgstr "" msgid "Capabilities" msgstr "" -#: classes/partials/admin.inc:7 classes/partials/_shortcodes-info.inc:2 -msgid "Shortcodes Info" +#: classes/partials/admin.inc:7 +msgid "Short codes Info" msgstr "" #: classes/partials/admin.inc:8 @@ -487,7 +494,7 @@ msgstr "" #: classes/partials/admin.inc:48 #, php-format -msgid "Might I suggest a $%0.2f donation?" +msgid "Might I suggest a $%1$0.2f donation for your %2$d transcripts?" msgstr "" #: classes/partials/_manage-queued-transcripts.inc:2 @@ -520,6 +527,10 @@ msgstr "" msgid "Change capabilities" msgstr "" +#: classes/partials/_shortcodes-info.inc:2 +msgid "Shortcodes Info" +msgstr "" + #: classes/partials/_shortcodes-info.inc:5 msgid "" "you can easily use these shortcodes with the appropriate buttons above all "