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

Board index phpBBex 1.x Поддержка

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

Post #1by Никита Однороб » 26.11.2013, 13:29

Кнопка Выделить всё в теге кода работает только в хроме. Firefox и IE ничего не делают. В чём может быть причина?
http://sun.mmcs.sfedu.ru/~Xaker/forum/viewtopic.php?f=2&t=1&p=5#p5
Никита Однороб
Topic author, Новичок
Reputation: 5
With us: 6 years 1 month

Post #2by darkxakep1 » 26.11.2013, 13:35

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

нда... с лисы не робит, попробуйте переустановить сам форум по новой
darkxakep1 M
Бывалый
Age: 32
Location: Оренбург
Reputation: 15
With us: 6 years 1 month

Post #3by Никита Однороб » 26.11.2013, 13:51

Ну я ещё ставил мод для подсветки синтаксиса. Может быть поэтому
Никита Однороб
Topic author, Новичок
Reputation: 5
With us: 6 years 1 month

Post #4by darkxakep1 » 26.11.2013, 14:11

скорее всего им и задели
darkxakep1 M
Бывалый
Age: 32
Location: Оренбург
Reputation: 15
With us: 6 years 1 month

Post #5by Никита Однороб » 26.11.2013, 14:25

Сравниваю файлы bbcode.php оригинальный и тот, что у меня. Вот отличия:
1. Оригинал:
Code: Select all
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. То, что у меня на форуме
Code: Select all
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;
   }

Added after 13 minutes 40 seconds:
VEG, пожалуйста, исправьте, тут где-то ошибка теперь (после модификации)
Code: Select all
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();
   }
}
Никита Однороб
Topic author, Новичок
Reputation: 5
With us: 6 years 1 month

Post #6by Sumanai » 26.11.2013, 15:28

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

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

Добавить после
Code: Select all
         $code = $code.'<br />';

Должно помочь.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1667
With us: 6 years 9 months

Post #7by factotum » 26.11.2013, 15:35

как-то переписывал в черновике весь код.
Code: Select all
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)
   }
};
Code: Select all
$(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
Гуру
Location: Люксембург
Reputation: 234
With us: 7 years 6 months

Post #8by Никита Однороб » 26.11.2013, 21:06

Sumanai, спасибо, всё работает! Тему можно закрыть
Никита Однороб
Topic author, Новичок
Reputation: 5
With us: 6 years 1 month

Post #9by Sumanai » 26.11.2013, 21:54

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

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

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

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

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

Пускай остаётся. Вдруг у кого ещё будут вопросы.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1667
With us: 6 years 9 months

Post #10by factotum » 27.11.2013, 09:09

Sumanai wrote:А сейчас не работает?
нет. в iOS немного по другому
Sumanai wrote:По моему лучше будет заменить
все правильно. но лучше заменить на класс.
Code: Select all
.on('click', '.select-code', function (e) {
класс присвоить псевдокнопке. Так будет быстрее за счет сокращения условий фильтрации + классы ищет быстрее, чем теги.
iOS не без своих заморочек. например, "load Deprecated, use pageshow instead".
Если "улучшение" стало "граблями" - Вы его переросли
factotum
Гуру
Location: Люксембург
Reputation: 234
With us: 7 years 6 months

Post #11by Гость » 21.07.2014, 19:46

Решил добавить на форум раскраску кода используя GeSHi, но возникла проблема с кнопкой "Выделить всё". Если включена нумерация строк то выделяет код в месте с номерами строк. При копировании теста в буфер обмена и его вставкой в любой текстовый редактор видно что сначала идут номера строк, а после них код. Как это исправить?
Отключать нумерацию не хочется Она нормально заработала только при такой конфигурации GeSHi.
Code: Select all
$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, то кнопка "Выделить всё" выделяет только код без номеров строк, но при этом код и/или номера строк отображаются некорректно.

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

Post #12by Гость » 22.07.2014, 10:42

Дополню свой вопрос. Блок кода обработаный GeSHi и содержащий две строки
Code: Select all
int i
long x
выглядит так.
Code: Select all
<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.
Гость
Гость

Post #13by Никита Однороб » 22.07.2014, 12:16

Гость, по идее будет выделяться только код, если будет таблица из двух столбцов (или два блока рядом) - в левом блоке номера страниц, в правом сам код
Никита Однороб
Topic author, Новичок
Reputation: 5
With us: 6 years 1 month


Return to Поддержка



cron