View source
<?php
function language_sections_menu() {
extract(_language_sections_get_ids());
$items[$mod_config_path] = array(
'title' => $mod_name,
'description' => 'Configure the %name module.',
'title arguments' => array(
'%name' => $mod_name,
),
'page callback' => 'language_sections_admin',
'access arguments' => array(
'administer filters',
),
);
return $items;
}
function language_sections_admin() {
return drupal_get_form('_language_sections_settings');
}
function language_sections_filter_info() {
$filters['language_sections'] = array(
'title' => t('Language Sections'),
'description' => t('Allows you to define content for several languages in a single text area.'),
'process callback' => '_filter_language_sections',
'settings callback' => '_filter_language_sections_settings',
'tips callback' => '_filter_language_sections_tips',
'cache' => FALSE,
);
return $filters;
}
function _filter_language_sections_tips($filter, $format, $long) {
$tvars = array(
'%all' => t('all'),
'%other' => t('other'),
);
$short_help = t(_language_sections_setting('short_help'), $tvars);
$long_help = $short_help;
return t($long ? $long_help : $short_help, $tvars);
}
function _language_sections_get_ids() {
$mod_id = 'language_sections';
$ids = array(
'mod_name' => 'Language Sections',
'mod_id' => $mod_id,
'mod_prefix' => $mod_id . '_shared_',
'mod_config_path' => sprintf('admin/config/regional/%s', $mod_id),
);
return $ids;
}
function _filter_language_sections($text, $filter, $format, $langcode, $cache, $cache_id) {
if (!$text || isset($GLOBALS['language_sections_disable'])) {
return $text;
}
global $language;
$pattern = _language_sections_setting('pattern');
$triggers = _language_sections_get_triggers();
extract(_language_sections_context('match_types'));
$n1 = $n2 = 2;
$n3 = 4;
$matches = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE);
$out = $matches[0];
$show_default = TRUE;
for ($i = $n1; $i < count($matches); $i += $n3) {
$trigger = drupal_strtolower($matches[$i]);
if (!isset($triggers[$trigger])) {
continue;
}
switch ($triggers[$trigger]) {
case $current_language:
$out .= $matches[$i + $n2];
$show_default = FALSE;
break;
case $all_languages:
$out .= $matches[$i + $n2];
break;
case $other_languages:
if ($show_default) {
$out .= $matches[$i + $n2];
}
else {
$show_default = TRUE;
}
break;
}
}
if (function_exists('ls_titles_process')) {
$out = ls_titles_process('set', $out, $format, $cache_id);
}
return $out;
}
function _language_sections_get_triggers($language = FALSE, $rebuild = FALSE) {
if (!$language) {
global $language;
}
extract(_language_sections_get_ids());
$varname = $mod_prefix . 'triggers_' . $language->language;
$triggers = variable_get($varname, NULL);
$check = crc32(serialize($language));
if ($rebuild || $triggers['check'] !== $check) {
$triggers = array(
'types' => _language_sections_build_triggers($mod_prefix, $language),
'check' => $check,
);
variable_set($varname, $triggers);
}
return $triggers['types'];
}
function _language_sections_build_triggers($mod_prefix, $language) {
extract(_language_sections_context());
foreach ($elements as $element) {
$key = 'trigger_' . $element;
if (_language_sections_setting($key)) {
$triggers[$language->{$element}] = $match_types['current_language'];
}
}
foreach ($specials as $name => $desc) {
$key = 'trigger_special_' . $name;
$matches = explode('|', _language_sections_setting($key));
foreach ($matches as $match) {
$triggers[strtolower($match)] = $match_types[$name . '_languages'];
}
}
return $triggers;
}
function _language_sections_setting($key, $delete = FALSE) {
extract(_language_sections_get_ids());
if ($delete) {
variable_del($mod_prefix . $key);
$setting = NULL;
}
else {
$setting = variable_get($mod_prefix . $key);
}
if ($setting === NULL) {
$defaults = array(
'pattern' => '/(=+ *([a-z]{2}[a-z\\-]*) *=+\\s?)(.*?)/i',
'trigger_language' => 1,
'trigger_special_all' => 'all',
'trigger_special_other' => 'other',
'short_help' => 'Mark language-dependent sections with <strong>== marker ==</strong> ' . 'where <em>marker</em> is either a valid language code or a special code such as %all or %other.',
);
$setting = isset($defaults[$key]) ? $defaults[$key] : FALSE;
}
return $setting;
}
function _language_sections_context($topic = FALSE) {
$context = array(
'elements' => array(
'language',
'name',
'prefix',
),
'specials' => array(
'all' => t('all languages'),
'other' => t('other languages'),
),
'match_types' => array(
'current_language' => 1,
'all_languages' => 2,
'other_languages' => 3,
),
);
return $topic ? $context[$topic] : $context;
}
function _filter_language_sections_settings($form, &$form_state, $filter, $format, $defaults, $filters) {
extract(_language_sections_get_ids());
$elements['info'] = array(
'#markup' => l('Configuration', $mod_config_path, array(
'query' => drupal_get_destination(),
)),
);
return $elements;
}
function _language_sections_settings($form, &$form_state) {
global $language;
$textsize = 40;
extract(_language_sections_get_ids());
extract(_language_sections_context());
$title = sprintf('%s (%s)', t($mod_name), t('global configuration'));
drupal_set_title($title);
$section =& $form;
$fieldset =& $section['triggers'];
$fieldset = array(
'#type' => 'fieldset',
'#title' => t('Current language triggers'),
'#description' => t('Which elements from current language can be used in language-section markers?'),
);
$title = '%element';
$desc = 'Language:%element is currently %value.';
foreach ($elements as $element) {
$key = 'trigger_' . $element;
$tvars = array(
'%element' => $element,
'%value' => $language->{$element} ? $language->{$element} : t('<blank>'),
);
$fieldset[$mod_prefix . $key] = array(
'#type' => 'checkbox',
'#title' => t($title, $tvars),
'#default_value' => _language_sections_setting($key),
'#description' => t($desc, $tvars),
);
}
$examples = array(
'all' => 'all|todos|toutes',
'other' => 'english|other|otro|autre',
);
foreach ($specials as $type => $desc) {
$key = 'trigger_special_' . $type;
$tvars = array(
'%desc' => $desc,
'%ex' => t($examples[$type]),
);
$section[$mod_prefix . $key] = array(
'#type' => 'textfield',
'#title' => t('Triggers for %desc sections', $tvars),
'#size' => $textsize,
'#default_value' => _language_sections_setting($key),
'#description' => t('Text that may mark an %desc section. Leave blank to disable, multiple entries allowed, e.g: %ex', $tvars),
);
}
$fieldset =& $section['advanced'];
$fieldset = array(
'#type' => 'fieldset',
'#title' => t('Advanced'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$key = 'short_help';
$fieldset[$mod_prefix . $key] = array(
'#type' => 'textarea',
'#title' => t('User help'),
'#rows' => 2,
'#default_value' => _language_sections_setting($key),
'#description' => t('Filter-help shown to the user. This text is passed through t().'),
);
$key = 'pattern';
$pattern = _language_sections_setting($key);
if (!$pattern) {
$pattern = _language_sections_setting($key, TRUE);
}
$fieldset[$mod_prefix . $key] = array(
'#type' => 'textfield',
'#title' => t('Alternative pattern'),
'#size' => $textsize,
'#default_value' => $pattern,
'#description' => t('This pattern will be used for finding sections in the text.' . ' You should not change the number of parenthesised groups in the expression.' . ' Set blank to reset to default.'),
);
if (!empty($_POST)) {
}
$form = system_settings_form($form);
$form['#submit'][] = 'language_sections_rebuild_triggers';
return $form;
}
function language_sections_rebuild_triggers() {
foreach (language_list() as $lang) {
_language_sections_get_triggers($lang, TRUE);
}
}
function language_sections_format_check($format) {
static $formats;
if (!isset($formats[$format])) {
$formats[$format] = FALSE;
$filters = filter_list_format($format);
foreach ($filters as $filter) {
if ($filter->module == 'language_sections') {
$formats[$format] = TRUE;
break;
}
}
}
return $formats[$format];
}