Кнопка Выделить всё в коде

Список разделов phpBBex 1.x (поддерживается) Поддержка 1.x

Описание: У вас проблемы с phpBBex 1.x и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть вопроса. Подробно описывайте проблему. Не забудьте указать версию phpBBex и какие моды установлены, по возможности добавьте скриншоты проблемы или ссылку на страницу с проблемой.
Модератор: Поддержка

Сообщение #1 Никита Однороб » 26.11.2013, 13:29

Кнопка Выделить всё в теге кода работает только в хроме. Firefox и IE ничего не делают. В чём может быть причина?
http://sun.mmcs.sfedu.ru/~Xaker/forum/viewtopic.php?f=2&t=1&p=5#p5
Никита Однороб
Автор темы
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2 darkxakep1 » 26.11.2013, 13:35

посмотрел вроде всё нормально работает=)щас через лису ещё гляну=)

нда... с лисы не робит, попробуйте переустановить сам форум по новой
darkxakep1 M
Откуда: Оренбург
Репутация: 15
С нами: 11 лет 1 месяц

Сообщение #3 Никита Однороб » 26.11.2013, 13:51

Ну я ещё ставил мод для подсветки синтаксиса. Может быть поэтому
Никита Однороб
Автор темы
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #4 darkxakep1 » 26.11.2013, 14:11

скорее всего им и задели
darkxakep1 M
Откуда: Оренбург
Репутация: 15
С нами: 11 лет 1 месяц

Сообщение #5 Никита Однороб » 26.11.2013, 14:25

Сравниваю файлы bbcode.php оригинальный и тот, что у меня. Вот отличия:
1. Оригинал:
Код: Выделить всё
function bbcode_second_pass_code($type, $code)
   {
      // when using the /e modifier, preg_replace slashes double-quotes but does not
      // seem to slash anything else
      $code = str_replace('\"', '"', $code);

      switch ($type)
      {
         case 'php':
            // Not the english way, but valid because of hardcoded syntax highlighting
            if (strpos($code, '<span class="syntaxdefault"><br /></span>') === 0)
            {
               $code = substr($code, 41);
            }

         // no break;

         default:
            $code = str_replace("\t", '&nbsp; &nbsp;', $code);
            $code = str_replace('  ', '&nbsp; ', $code);
            $code = str_replace('  ', ' &nbsp;', $code);
            $code = str_replace("\n ", "\n&nbsp;", $code);

            // keep space at the beginning
            if (!empty($code) && $code[0] == ' ')
            {
               $code = '&nbsp;' . substr($code, 1);
            }

            // remove newline at the beginning
            if (!empty($code) && $code[0] == "\n")
            {
               $code = substr($code, 1);
            }
         break;
      }

      $code = $this->bbcode_tpl('code_open') . $code . $this->bbcode_tpl('code_close');

      return $code;
   }
2. То, что у меня на форуме
Код: Выделить всё
function bbcode_second_pass_code($type, $code)
   {
      $code = str_replace('\"', '"', $code);
      $geshi_path = './includes/geshi/geshi.php';

      if( !include_once( $geshi_path ) ) {
      } else {   
         $astr_to = array('<', '>', '[', ']', '.', ':','"');
         $astr_from = array('&lt;', '&gt;', '[', ']', '.', ':','&quot;');

         $code = str_replace($astr_from, $astr_to, $code);
         if (!strlen($type)){
         $type='purebasic';
       }
      
         $geshi = new GeSHi( $code, $type );
         $geshi->set_header_type(GESHI_HEADER_NONE);

         $code = $geshi->parse_code();   

         $code = str_replace( '<br />', '', $code );
     
      }

      $code = $this->bbcode_tpl('code_open') . $code . $this->bbcode_tpl('code_close');

      return $code;
   }

Добавлено спустя 13 минут 40 секунд:
VEG, пожалуйста, исправьте, тут где-то ошибка теперь (после модификации)
Код: Выделить всё
function selectCode(a)
{
   // Get ID of code block
   var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];

   // Not IE and IE9+
   if (window.getSelection)
   {
      var s = window.getSelection();
      // Safari
      if (s.setBaseAndExtent)
      {
         s.setBaseAndExtent(e, 0, e, e.innerText.length - 1);
      }
      // Firefox and Opera
      else
      {
         // workaround for bug # 42885
         if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) == '<BR>')
         {
            e.innerHTML = e.innerHTML + '&nbsp;';
         }

         var r = document.createRange();
         r.setStart(e.firstChild, 0);
         r.setEnd(e.lastChild, e.lastChild.textContent.length);
         s.removeAllRanges();
         s.addRange(r);
      }
   }
   // Some older browsers
   else if (document.getSelection)
   {
      var s = document.getSelection();
      var r = document.createRange();
      r.selectNodeContents(e);
      s.removeAllRanges();
      s.addRange(r);
   }
   // IE
   else if (document.selection)
   {
      var r = document.body.createTextRange();
      r.moveToElementText(e);
      r.select();
   }
}
Никита Однороб
Автор темы
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #6 Sumanai » 26.11.2013, 15:28

Никита Однороб:тут где-то ошибка теперь (после модификации)

Тут ничего не изменилось, затык в другом- этот плагин оборачивает все элементы в спаны, и яваскрипту не за что зацепиться.
Решение простое-
Найти
Код: Выделить всё
         $code = str_replace( '<br />', '', $code );

Добавить после
Код: Выделить всё
         $code = $code.'<br />';

Должно помочь.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #7 factotum » 26.11.2013, 15:35

как-то переписывал в черновике весь код.
Код: Выделить всё
jQuery.fn.selectText = function(){
   var d = document,
      element = this[0],
      range, selection
   if (d.body.createTextRange) {
      range = d.body.createTextRange()
      range.moveToElementText(element)
      range.select()
   } else if (window.getSelection) {
      selection = window.getSelection()
      range = d.createRange()
      range.selectNodeContents(element)
      selection.removeAllRanges()
      selection.addRange(range)
   }
};
Код: Выделить всё
$(document)
         // Code
         .on('click', '.codebox > dt', function (e) {
            e.preventDefault()
            e.stopPropagation()
            $(this).closest('.codebox').find('code').selectText()
         })
вроде и на iOS заработало, точно не помню.
так показалось прозрачней и практичней. весь код можно вынести в файл js. из ссылки в bbcode можно убрать остатки:
<a href="#" onclick="selectCode(this); return false;">Выделить всё</a>
factotum
Откуда: Люксембург
Репутация: 234
С нами: 12 лет 7 месяцев

Сообщение #8 Никита Однороб » 26.11.2013, 21:06

Sumanai, спасибо, всё работает! Тему можно закрыть
Никита Однороб
Автор темы
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #9 Sumanai » 26.11.2013, 21:54

factotum:так показалось прозрачней и практичней.

Ловит клик по всему заголовку, а не только по надписи. По моему лучше будет заменить
Код: Выделить всё
<a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a>
На
Код: Выделить всё
<span>{L_SELECT_ALL_CODE}</span>
И в вашем яваскрипт
Код: Выделить всё
.on('click', '.codebox > dt', function (e) {
На
Код: Выделить всё
.on('click', '.codebox > dt > span', function (e) {
Чтобы не плодить ссылки, ведущие в никуда.

factotum:вроде и на iOS заработало, точно не помню.

А сейчас не работает?

Никита Однороб:Тему можно закрыть

Пускай остаётся. Вдруг у кого ещё будут вопросы.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #10 factotum » 27.11.2013, 09:09

Sumanai:А сейчас не работает?
нет. в iOS немного по другому
Sumanai:По моему лучше будет заменить
все правильно. но лучше заменить на класс.
Код: Выделить всё
.on('click', '.select-code', function (e) {
класс присвоить псевдокнопке. Так будет быстрее за счет сокращения условий фильтрации + классы ищет быстрее, чем теги.
iOS не без своих заморочек. например, "load Deprecated, use pageshow instead".
factotum
Откуда: Люксембург
Репутация: 234
С нами: 12 лет 7 месяцев

Сообщение #11 Гость » 21.07.2014, 19:46

Решил добавить на форум раскраску кода используя GeSHi, но возникла проблема с кнопкой "Выделить всё". Если включена нумерация строк то выделяет код в месте с номерами строк. При копировании теста в буфер обмена и его вставкой в любой текстовый редактор видно что сначала идут номера строк, а после них код. Как это исправить?
Отключать нумерацию не хочется Она нормально заработала только при такой конфигурации GeSHi.
Код: Выделить всё
$geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
$geshi->set_header_type(GESHI_HEADER_PRE_TABLE);
Если в место GESHI_HEADER_PRE_TABLE использовать GESHI_HEADER_DIV, GESHI_HEADER_PRE или GESHI_HEADER_PRE_VALID, то кнопка "Выделить всё" выделяет только код без номеров строк, но при этом код и/или номера строк отображаются некорректно.

Еще подскажите пожалуйста как можно вывести любой текст между словом "Код:" и кнопкой "Выделить всё"? В этой области необходимо отобразить название языка программирования код которого раскрашивается.
Гость
Гость

Сообщение #12 Гость » 22.07.2014, 10:42

Дополню свой вопрос. Блок кода обработаный GeSHi и содержащий две строки
Код: Выделить всё
int i
long x
выглядит так.
Код: Выделить всё
<dl class="codebox"><dt>Код: <a href="#" onclick="selectCode(this); return false;">Выделить всё</a></dt><dd><code><table class="c" ><tbody><tr class="li1"><td style="width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;"><pre style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">1<br />2<br /></pre></td><td style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><pre style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #993333;">int</span> i<br /><span style="color: #993333;">long</span> x</pre></td></tr></tbody></table><br /></code></dd></dl>
Что нужно изменить в функции selectCode() файла forum_fn.js чтобы выделялся только код без номеров строк? У меня к сожалению не очень хорошие знания js.
Гость
Гость

Сообщение #13 Никита Однороб » 22.07.2014, 12:16

Гость, по идее будет выделяться только код, если будет таблица из двух столбцов (или два блока рядом) - в левом блоке номера страниц, в правом сам код
Никита Однороб
Автор темы
Репутация: 5
С нами: 11 лет 1 месяц


Вернуться в Поддержка 1.x