CodeEnhancements - расширение для тега code

Сохраняет табуляторы в теге code и не даёт им превращаться в пробелы

В данном форуме будут выкладываться работы других программистов, не относящихся к нашему сайту, а также переводы и дополнения к ним.
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

Любой, кто знаком с phpBB, знает, что для редактирования текста в этом движке используются так называемые BB-коды (или теги). Среди них есть специальный тег code, который предназначен для оформления программного кода, а также языков CSS и HTML. При написании внутреннего программного кода в phpBB, как и в некоторых других движках, используются табуляторы (символы, которые вставляются при нажатии на клавишу TAB), что позволяет задать коду красивый и удобочитаемый вид. Беда в том, что стандартный тег code не сохраняет эти табуляторы при отображении размещённого в сообщении кода, а вместо этого заменяет их на пробелы. Если у вас какой-нибудь обычный форум, не посвящённый программированию и веб-строительству, то это не очень большая проблема, потому что на таких форумах тег code обычно используется довольно редко. Но если на форуме постоянно выкладываются какие-нибудь коды, которые нужно копировать и в указанных файлах искать, то это превращается в настоящую головную боль. И тут как нельзя кстати приходится мод "CodeEnhancements" от зарубежного автора Martin Truckenbrodt, который я выложил ниже. Этот мод полностью устраняет описанную выше проблему.
CodeEnhancements_1.0.2.zip
(67.27 КБ) 1011 скачиваний
CodeEnhancements_1.0.2.zip
(67.27 КБ) 1011 скачиваний
Русификация к нему не нужна, так как мод не меняет и не добавляет файлы языка.

Замечу, что мод пока не работает, если используется подсветка для php-кода ([code=php]), но лично для меня это не столь важно, потому что при работе с кодами достаточно хотя бы просто иметь возможность скопировать их в первоначальном виде, это уже хорошо. Возможно, автор исправит эту деталь в следующих версиях своего мода.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Расширил функционал этого мода. Добавил кроме всего прочего подсветку синтаксиса. Назвал hcode, см. тему на моей тестовой площадке. Там же примерчики - само описание мода.

Shredder, если будешь ставить у себя, перетащу к тебе описание (или сам копируй), с раскраской синтаксиса всё смотрится имхо лучше :D Лично я доволен результатом. Хотя это пока бета, для subsilver2 тоже пока не делал.

Добавлено спустя 8 минут 38 секунд:
Да, теперь это уже не мод стороннего разработчика, а свой мод на моде стороннего разработчика :lol: типа того.
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

c61
Идея с подсветкой кода хорошая, мне нравится, но всё-таки работает эта штука некорректно.
Поставил тут, посмотрел, везде (даже в IE) пашет, в FF 27 - не пашет... Если скопировать код, то при его вставке добавляет паразитные пробелы перед каждой строчкой. На твоём сайте то же самое.

Браузеры, панимаешь... от этого говна так просто не избавиться 8-)

Добавлено спустя 2 минуты 37 секунд:
Кроме того, в интернет эксплорер в левом нижнем углу появляется жёлтый треугольник, потому что файл highlight.pack.js продуцирует ошибки javascript, а это уже само по себе некрасиво.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Shredder писал(а):в FF 27 - не пашет...
В FF 26 всё ok. Ща поставлю 27... поставил, всё OK.
Shredder писал(а): Если скопировать код, то при его вставке добавляет паразитные пробелы перед каждой строчкой. На твоём сайте то же самое.
И правда... Однако, только в случае "выделить всё" и затем копировать. Будем копать.
Shredder писал(а):файл highlight.pack.js продуцирует ошибки javascript
Что есть, то есть... Однако, поправимо.
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

c61 писал(а):поставил, всё OK.
На всякий случай: я не имел в виду, что совсем не работает. Речь шла именно об этих пробелах :D
c61 писал(а): только в случае "выделить всё" и затем копировать
Не только. Если просто выделить мышью от начала до конца, не нажимая "выделить всё", то будет то же самое.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Кое-что переделал, выпускаю v.0.0.2, ссылка та же.

Исправил выделение для FF 27, пробелы не добавляются. См. примечание к п.1.

См. также измененные п. 11, 12.

Остальное без изменений.

IE11 не находит ошибок в highlight.pack.js, а других под рукой нету...
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

Елси использовать [code=css], то при нажатии "выделить всё" просто кидает на главную без каких-либо объяснений... И баг с пробелами именно в этом случае (css) никуда не ушёл. И опять "отличился" FF. На твоём же сайте, в 3-м, 9, 10 и 12-м пунктах вместо выделения кидает наверх страницы, причём в п. 12 - только для первого куска кода.

Все подсветки я, конечно, не проверял. Тестировал только css, php, sql и обычный "не подсвеченный" код.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Странно... С чего бы наверх кидать... Похоже, это происходит, если первый символ в окошке кода не табуляция, а какой-то значащий.

Баг с пробелами для code=css не наблюдаю почему-то.
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

У меня происходит в любом случае, даже если табуляция.
c61 писал(а):Баг с пробелами для code=css не наблюдаю почему-то.
Именно если полностью выделить мышью в FF?
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Shredder писал(а):Именно если полностью выделить мышью в FF?
Обнаружил баг в FF. Исправление в forum_fn.js

Код: Выделить всё

				// FireFox bug
				e.innerHTML = e.innerHTML + ' ';
				r.setStart(e.firstChild, 0);
				r.setEnd(e.lastChild, e.lastChild.textContent.length-1);
Функция полностью:

Код: Выделить всё

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 + ' ';
			}

			var r = document.createRange();

			var ua = navigator.userAgent;

			if (window.opera || (ua.search(/MSIE/) > -1))
			{
				r.selectNodeContents(e);
			}
			else
			{
				// FireFox bug
				e.innerHTML = e.innerHTML + ' ';
				r.setStart(e.firstChild, 0);
				r.setEnd(e.lastChild, e.lastChild.textContent.length-1);
			}
			s.removeAllRanges();
			s.addRange(r);
		}
	}
	// Some older browsers
	else if (document.getSelection)
	{
		var s = document.getSelection();
		var r = document.createRange();

		r.selectNodeContents(e);
		//r.setStart(e.firstChild, 0);
		//r.setEnd(e.lastChild, e.lastChild.textContent.length);
		s.removeAllRanges();
		s.addRange(r);
	}
	// IE
	else if (document.selection)
	{
		var r = document.body.createTextRange();
		r.moveToElementText(e);
		r.select();
	}
}
вроде не проявлется о чём ты говорил... хотя хз))
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

Конкретно этого бага в FF вроде бы больше нет. Хотя обратил внимание, что в самый хвост кода в некоторых случаях добавлялись какие-то паразитные пробелы, но так и не понял, в каких именно.

И только сейчас обратил внимание, что в IE8 подсветка вообще не работает. То ли так и было, то ли после всех дополнительных правок появилось - хз.

Не совсем понял - html это для мода подсветки то же самое, что и xml? Когда пишешь code=html, то просто обрезает часть =html и всё, а на сайте, где скачивается скрипт подсветки, HTML и XML поставлены около одного и того же чекбокса.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Shredder писал(а):Не совсем понял - html это для мода подсветки то же самое, что и xml? Когда пишешь code=html, то просто обрезает часть =html и всё, а на сайте, где скачивается скрипт подсветки, HTML и XML поставлены около одного и того же чекбокса.
Вроде xml и html одно и то же, для html надо указывать xml.
Shredder писал(а):в IE8 подсветка вообще не работает
Завтра-послезавтра проверю. Возможно, и не работала)
Shredder писал(а):в самый хвост кода в некоторых случаях добавлялись какие-то паразитные пробелы
Похоже это из-за бага в FF. Сейчас не добавляются ?
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

Добавляются. Причём, болезнь очень странная: сначала может и не быть, но стоит выделить тот же самый код в другой раз - уже есть. И далее, если его выделяешь повторно, то без какой-либо перезагрузки начинают появляться всё новые и новые пробелы, будто из рога изобилия :D
code_crap.png
В самом коде пробелов нет.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

CodeEnhancements - расширение для тега code

Сообщение c61 »

Ааааа, понял, о чем ты! Это известная фича, после каждого выделения в самый конец текста окошка будет добавляться один пробел - последний символ. С этим борюсь. пока никак не могу победить. Эта фича, кстати, присутствует в исходном коде фунции, то есть фича самого phpbb.

Добавлено спустя 18 минут 58 секунд:
Исправил. Код функции:

Код: Выделить всё

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
		{
			if(e.innerHTML.length > 6)
			{
				if(e.innerHTML.substring(e.innerHTML.length - 6) == ' ')
				{
					e.innerHTML = e.innerHTML.slice(0, -6);
				}
			}

			// workaround for bug # 42885
			if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) == '<BR>')
			{
				e.innerHTML = e.innerHTML + ' ';
			}

			var r = document.createRange();

			var ua = navigator.userAgent;

			if (window.opera || (ua.search(/MSIE/) > -1))
			{
				r.selectNodeContents(e);
			}
			else
			{
				// FireFox bug
				e.innerHTML = e.innerHTML + ' ';
				r.setStart(e.firstChild, 0);
				r.setEnd(e.lastChild, e.lastChild.textContent.length-1);
			}
			s.removeAllRanges();
			s.addRange(r);
		}
	}
	// Some older browsers
	else if (document.getSelection)
	{
		var s = document.getSelection();
		var r = document.createRange();

		r.selectNodeContents(e);
		//r.setStart(e.firstChild, 0);
		//r.setEnd(e.lastChild, e.lastChild.textContent.length);
		s.removeAllRanges();
		s.addRange(r);
	}
	// IE
	else if (document.selection)
	{
		var r = document.body.createTextRange();
		r.moveToElementText(e);
		r.select();
	}
}
Добавлено спустя 5 минут 5 секунд:
Однако, если выделить всё, снять выделение и пытаться копировать только последнюю строку, в ней окажется в самом конце лишний пробел. С этим ничего не поделать. Если же снова выделить всё, перед выделением пробел будет удалён.

Добавлено спустя 1 минуту 19 секунд:
Если код заканчивается на   то при первом выделении всего этот неразрывный пробел не будет удалён, ибо & заменен на & и это будет уже не  
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

CodeEnhancements - расширение для тега code

Сообщение Shredder »

c61 писал(а):Эта фича, кстати, присутствует в исходном коде фунции, то есть фича самого phpbb.
Посмотрел - в стандартном phpbb и на phpbbguru (где тоже установлена подсветка) багов с пробелами нет.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Ответить