Index: geshifilter.admin.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.admin.inc,v retrieving revision 1.20 diff -u -b -u -p -r1.20 geshifilter.admin.inc --- geshifilter.admin.inc 27 Jun 2009 12:54:15 -0000 1.20 +++ geshifilter.admin.inc 29 Jun 2009 20:02:19 -0000 @@ -23,6 +23,7 @@ function _geshifilter_filter_settings($f if (geshifilter_use_format_specific_options()) { // tags and attributes $form['geshifilter']['general_tags'] = _geshifilter_general_highlight_tags_settings($format); + $form['#validate'][] = '_geshifilter_tag_styles_validate'; // per language tags $form['geshifilter']['per_language_settings'] = array( '#type' => 'fieldset', @@ -41,6 +42,22 @@ function _geshifilter_filter_settings($f } /** + * Validation handler for the tag styles form element. + * Covers usage in the general form of geshifilter_admin_general_settings() + * and the format specific (sub)form of _geshifilter_filter_settings(). + */ +function _geshifilter_tag_styles_validate($form, &$form_state) { + // If we're coming from the _geshifilter_filter_settings (sub)form, we should + // take the input format into account. + $f = isset($form_state['values']['format']) ? '_'. $form_state['values']['format'] : ''; + + // Check that at least one tag style is selected. + if (0 == count(array_filter($form_state['values']["geshifilter_tag_styles{$f}"]))) { + form_set_error("geshifilter_tag_styles{$f}", t('At least one tag style should be selected.')); + } +} + +/** * General settings form for the GeSHi filter. */ function geshifilter_admin_general_settings(&$form_state) { @@ -100,9 +117,10 @@ function geshifilter_admin_general_setti '#default_value' => geshifilter_use_format_specific_options(), '#description' => t('Enable seperate tag settings of the GeSHi filter for each input format instead of global tag settings.', array('!input_formats' => url('admin/settings/filters'))), ); - // generic tags + // Generic tags settings. if (!geshifilter_use_format_specific_options()) { $form['geshifilter_tag_options']['geshifilter_general_tags'] = _geshifilter_general_highlight_tags_settings(); + $form['#validate'][] = '_geshifilter_tag_styles_validate'; } // GeSHi filter highlighting options @@ -358,19 +376,20 @@ function _geshifilter_general_highlight_ '#default_value' => geshifilter_tags($format), '#description' => t('Tags that should activate the GeSHi syntax highlighting. Specify a space-separated list of tagnames.'), ); - // tag style - $form["geshifilter_brackets$f"] = array( - '#type' => 'select', - '#title' => t('Tag style'), + // Container tag styles. + $form["geshifilter_tag_styles$f"] = array( + '#type' => 'checkboxes', + '#title' => t('Container tag style'), '#options' => array( - GESHIFILTER_BRACKETS_ANGLE => '', - GESHIFILTER_BRACKETS_SQUARE => '[foo]', - GESHIFILTER_BRACKETS_BOTH => t('!angle or !square', array('!angle' => '', '!square' => '[foo]')), + GESHIFILTER_BRACKETS_ANGLE => ''. check_plain(' ... ') .'', + GESHIFILTER_BRACKETS_SQUARE => ''. check_plain('[foo] ... [/foo]') .'', + GESHIFILTER_BRACKETS_DOUBLESQUARE => ''. check_plain('[[foo]] ... [[/foo]]') .'', ), - '#default_value' => _geshifilter_brackets($format), - '#description' => t('Select which brackets should be used for the source code container tags.'), + '#default_value' => _geshifilter_tag_styles($format), + '#description' => t('Select the container tag styles that should trigger GeSHi syntax highlighting.'), ); - // PHP specific delimiters + // PHP specific delimiters. + // @todo: merge this option into geshifilter_tag_styles$f. $form['geshifilter']["geshifilter_enable_php_delimiters$f"] = array( '#type' => 'checkbox', '#title' => t('Also apply syntax highlighting to <?php ... ?> style PHP source code blocks.'), Index: geshifilter.filtertips.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.filtertips.inc,v retrieving revision 1.5 diff -u -b -u -p -r1.5 geshifilter.filtertips.inc --- geshifilter.filtertips.inc 21 Jul 2008 17:44:23 -0000 1.5 +++ geshifilter.filtertips.inc 29 Jun 2009 20:02:19 -0000 @@ -12,6 +12,7 @@ require_once drupal_get_path('module', ' * Implementation for geshifilter_filter_tips() */ function _geshifilter_filter_tips($delta, $format, $long = FALSE) { + // @todo: replace this with _geshifilter_tag_styles() usage. if (_geshifilter_brackets($format) == GESHIFILTER_BRACKETS_SQUARE) { $bracket_open = '['; $bracket_close = ']'; @@ -76,6 +77,7 @@ function _geshifilter_filter_tips($delta // block versus inline $items[] = t('If the source code between the tags contains a newline (e.g. immediatly after the opening tag), the highlighted source code will be displayed as a code block. Otherwise it will be displayed inline.'); + // @todo: replace this with the new system. if (_geshifilter_brackets($format) == GESHIFILTER_BRACKETS_BOTH) { $items[] = t('Beside the tag style "!angle" it is also possible to use "!bracket".' , array('!angle' => '<foo>', '!bracket' => '[foo]')); } Index: geshifilter.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.inc,v retrieving revision 1.5 diff -u -b -u -p -r1.5 geshifilter.inc --- geshifilter.inc 21 Jul 2008 17:44:23 -0000 1.5 +++ geshifilter.inc 29 Jun 2009 20:02:19 -0000 @@ -179,6 +179,7 @@ function _geshifilter_php_delimeters($fo return variable_get("geshifilter_enable_php_delimiters_{$format}", _geshifilter_php_delimeters()); } +// @todo: remove this function. function _geshifilter_brackets($format = NULL) { if (!geshifilter_use_format_specific_options() || $format === NULL) { return variable_get('geshifilter_brackets', GESHIFILTER_BRACKETS_BOTH); @@ -186,6 +187,16 @@ function _geshifilter_brackets($format = return variable_get("geshifilter_brackets_{$format}", _geshifilter_brackets()); } +function _geshifilter_tag_styles($format = NULL) { + if (!geshifilter_use_format_specific_options() || $format === NULL) { + return variable_get('geshifilter_tag_styles', array( + GESHIFILTER_BRACKETS_ANGLE => GESHIFILTER_BRACKETS_ANGLE, + GESHIFILTER_BRACKETS_SQUARE => GESHIFILTER_BRACKETS_SQUARE, + )); + } + return variable_get("geshifilter_tag_styles_{$format}", _geshifilter_tag_styles()); +} + function geshifilter_language_tags($language, $format = NULL) { if (!geshifilter_use_format_specific_options() || $format === NULL) return variable_get("geshifilter_language_tags_{$language}", ''); Index: geshifilter.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.module,v retrieving revision 1.45 diff -u -b -u -p -r1.45 geshifilter.module --- geshifilter.module 27 Jun 2009 12:54:15 -0000 1.45 +++ geshifilter.module 29 Jun 2009 20:02:20 -0000 @@ -24,7 +24,8 @@ define('GESHIFILTER_ATTRIBUTE_FANCY_N', define('GESHIFILTER_BRACKETS_ANGLE', 1); define('GESHIFILTER_BRACKETS_SQUARE', 2); -define('GESHIFILTER_BRACKETS_BOTH', 3); +define('GESHIFILTER_BRACKETS_DOUBLESQUARE', 4); +define('GESHIFILTER_BRACKETS_BOTH', 3); //@todo: delete this line when ready. define('GESHIFILTER_LINE_NUMBERS_DEFAULT_NONE', 0); define('GESHIFILTER_LINE_NUMBERS_DEFAULT_NORMAL', 1); Index: geshifilter.pages.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.pages.inc,v retrieving revision 1.10 diff -u -b -u -p -r1.10 geshifilter.pages.inc --- geshifilter.pages.inc 4 Jan 2009 17:44:38 -0000 1.10 +++ geshifilter.pages.inc 29 Jun 2009 20:02:20 -0000 @@ -107,22 +107,25 @@ function _geshifilter_prepare($format, $ // Also matches "...$" where "$" refers to end of string, not end of // line (because PCRE_MULTILINE (modifier 'm') is not enabled), so matching // still works when teaser view trims inside the source code. - switch (_geshifilter_brackets($format)) { - case GESHIFILTER_BRACKETS_ANGLE: + + // Replace the code container tag brackets + // and prepare the container content (newline and angle bracket protection). + // @todo: make sure that these replacements can be done in serie. + $tag_styles = array_filter(_geshifilter_tag_styles($format)); + if (in_array(GESHIFILTER_BRACKETS_ANGLE, $tag_styles)) { $pattern = '#(<)('. $tags_string .')((\s+[^>]*)*)(>)(.*?)(|$)#s'; - break; - case GESHIFILTER_BRACKETS_SQUARE: - $pattern = '#(\[)('. $tags_string .')((\s+[^\]]*)*)(\])(.*?)(\[/\2\s*\]|$)#s'; - break; - case GESHIFILTER_BRACKETS_BOTH: - $pattern = '#([<\[])('. $tags_string .')((\s+[^>\]]*)*)([>\]])(.*?)(\1/\2\s*\5|$)#s'; - break; + $text = preg_replace_callback($pattern, create_function('$match', "return _geshifilter_prepare_callback(\$match, $format);"), $text); } - // replace the code container tag brackets - // and prepare the container content (newline and angle bracket protection) + if (in_array(GESHIFILTER_BRACKETS_SQUARE, $tag_styles)) { + $pattern = '#((? blocks. if (_geshifilter_php_delimeters($format)) { - // prepare < ?php ... ? > blocks $text = preg_replace_callback('#[\[<](\?php|\?PHP|%)(.+?)((\?|%)[\]>]|$)#s', '_geshifilter_prepare_php_callback', $text); } return $text;