[BETA] HCode - расширенный функционал code

Здесь авторы могут постить бета-версии своих модификаций для phpBB 3.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

[BETA] HCode - расширенный функционал code

Сообщение c61 »

phpBB mod hcode v.0.1.5-20141013
copyright (c) 2014 c61 http://c61.no-ip.org <c61@yandex.ru>
license http://opensource.org/licenses/gpl-license.php GNU Public License

Мод предназначен для расширения фунционала ББ-кода code, в том числе:
  • сохранения кодов табуляции в публикуемом коде (в немодифицированной конференции табуляции заменятся на пробелы)
  • добавления возможности расширения окошка кода по вертикали (при появлении прокрутки) и горизонтали
  • добавления возможности нумерации строк
  • подсветки синтаксиса кода с указанием языка (по умолчанию автоматическое разпознавание языка отключено)
Скриншоты:
1.jpg
2.jpg
3.jpg
Похожих модов phpBB десяток как минимум, а может и намного больше. Но ни один из них не устроил меня по функционалу, поэтому и был реализован этот мод.

Части кода этого мода были взяты из модов CodeEnhancements_1.0.2, highlight.js, randomessence-highlight.js и др., а также с http://phpbbguru.net (в том числе сообщения Кнопка "Развернуть" в {code} ). Спасибо Авторам !

Установка:

1) Скачать highlight.js с http://highlightjs.org/download/ . Актуальная на момент создания этого мода версия 8.0. Набор языков можно оставить по умолчанию либо какие-то убрать/добавить.

Разархивировать highlight.zip и переписать его содержимое в styles/highlight (каталог предварительно создать).

2) В includes/bbcode.php найти

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

		static $replacements = array(
и добавить ПОСЛЕ

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

			'code_open'				=> array('{LANGUAGE}'	=> '$1'),
затем найти функцию bbcode_second_pass_code и ЗАМЕНИТЬ её код между открывающей и закрывающей фигурной скобками на

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

		// when using the /e modifier, preg_replace slashes double-quotes but does not
		// seem to slash anything else
		$code = str_replace('\"', '"', $code);
		$code = str_replace("\n", "\r", $code);

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

		// Autohighlight ON
		//if ($type == 'off')

		// Autohighlight OFF
		if (empty($type) || ($type == 'off'))

		{
			$type = 'no-highlight';
		}

		// Autohighlight AUTO
		if ($type == 'auto')
		{
			$type = '';
		}

		$code_open = str_replace('$1', $type, $this->bbcode_tpl('code_open'));
		$code = $code_open . $code . $this->bbcode_tpl('code_close');

		return $code;
Обратите внимание: по умолчанию автоматическое распознавание языка (и подсветка синтаксиса) будет отключено. Для включения замените условия Autohighlight ON/OFF.

3) В includes/message_parser.php найти

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

			case 'php':

				$remove_tags = false;

				$str_from = array('<', '>', '&#91;', '&#93;', '&#46;', '&#58;', '&#058;');
				$str_to = array('<', '>', '[', ']', '.', ':', ':');
				$code = str_replace($str_from, $str_to, $code);

				if (!preg_match('/\<\?.*?\?\>/is', $code))
				{
					$remove_tags = true;
					$code = "<?php $code ?>";
				}

				$conf = array('highlight.bg', 'highlight.comment', 'highlight.default', 'highlight.html', 'highlight.keyword', 'highlight.string');
				foreach ($conf as $ini_var)
				{
					@ini_set($ini_var, str_replace('highlight.', 'syntax', $ini_var));
				}

				// Because highlight_string is specialcharing the text (but we already did this before), we have to reverse this in order to get correct results
				$code = htmlspecialchars_decode($code);
				$code = highlight_string($code, true);

				$str_from = array('<span style="color: ', '<font color="syntax', '</font>', '<code>', '</code>','[', ']', '.', ':');
				$str_to = array('<span class="', '<span class="syntax', '</span>', '', '', '&#91;', '&#93;', '&#46;', '&#58;');

				if ($remove_tags)
				{
					$str_from[] = '<span class="syntaxdefault"><?php </span>';
					$str_to[] = '';
					$str_from[] = '<span class="syntaxdefault"><?php&nbsp;';
					$str_to[] = '<span class="syntaxdefault">';
				}

				$code = str_replace($str_from, $str_to, $code);
				$code = preg_replace('#^(<span class="[a-z_]+">)\n?(.*?)\n?(</span>)$#is', '$1$2$3', $code);

				if ($remove_tags)
				{
					$code = preg_replace('#(<span class="[a-z]+">)?\?>(</span>)#', '$1&nbsp;$2', $code);
				}

				$code = preg_replace('#^<span class="[a-z]+"><span class="([a-z]+)">(.*)</span></span>#s', '<span class="$1">$2</span>', $code);
				$code = preg_replace('#(?:\s++|&nbsp;)*+</span>$#u', '</span>', $code);

				// remove newline at the end
				if (!empty($code) && substr($code, -1) == "\n")
				{
					$code = substr($code, 0, -1);
				}
и ЗАМЕНИТЬ на

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

			case 'off':	// Highlight OFF
			case 'auto':	// Highlight Auto
			case '1c':
			case 'actionscript':
			case 'apache':
			case 'applescript':
			case 'asciidoc':
			case 'autohotkey':
			case 'avrasm':
			case 'axapta':
			case 'bash':
			case 'brainfuck':
			case 'clojure':
			case 'cmake':
			case 'coffeescript':
			case 'cpp':
			case 'cs':
			case 'css':
			case 'd':
			case 'delphi':
			case 'diff':
			case 'django':
			case 'dos':
			case 'elixir':
			case 'erlang-repl':
			case 'erlang':
			case 'fix':
			case 'fsharp':
			case 'glsl':
			case 'go':
			case 'haml':
			case 'handlebars':
			case 'haskell':
			case 'html':
			case 'http':
			case 'ini':
			case 'java':
			case 'javascript':
			case 'json':
			case 'lasso':
			case 'lisp':
			case 'livecodeserver':
			case 'lua':
			case 'makefile':
			case 'markdown':
			case 'mathematica':
			case 'matlab':
			case 'mel':
			case 'mizar':
			case 'nginx':
			case 'nix':
			case 'nsis':
			case 'objectivec':
			case 'ocaml':
			case 'oxygene':
			case 'parser3':
			case 'perl':
			case 'php':
			case 'profile':
			case 'protobuf':
			case 'python':
			case 'r':
			case 'rib':
			case 'rsl':
			case 'ruby':
			case 'ruleslanguage':
			case 'rust':
			case 'scala':
			case 'scilab':
			case 'scss':
			case 'smalltalk':
			case 'sql':
			case 'tex':
			case 'vala':
			case 'vbnet':
			case 'vbscript':
			case 'vhdl':
			case 'vim':
			case 'x86asm':
			case 'xml':
Где: Для использования "code" в сообщении просто укажите параметр - имя языка, например, для php "code=php", для html "code=html" и т.п.

Учтите, что для "code=auto" и короткого кода весьма вероятны ошибки автоматического определения языка.

4) В файле language/en/common.php найти и добавить ПЕРЕД

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

// HCode mod begin
$lang = array_merge($lang, array(
	'HCODE_LINES'	=> 'Lines',
	'HCODE_NUMERATION_ON'	=> 'Switch ON Numeration',
	'HCODE_NUMERATION_OFF'	=> 'Switch OFF Numeration',
	'HCODE_HLJS_LANGUAGE'	=> 'Language',
	'HCODE_HLJS_IDENTIFIED'	=> 'Identified',
));
// HCode mod end
5) В файле language/ru/common.php найти и добавить ПЕРЕД

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

// HCode mod begin
$lang = array_merge($lang, array(
	'HCODE_LINES'	=> 'Строки',
	'HCODE_NUMERATION_ON'	=> 'Вкл.Нумерацию',
	'HCODE_NUMERATION_OFF'	=> 'Откл.Нумерацию',
	'HCODE_HLJS_LANGUAGE'	=> 'Язык',
	'HCODE_HLJS_IDENTIFIED'	=> 'Распознан',
));
// HCode mod end
6) Для стилей, основанных на prosilver, вносим следующие изменения.

6.1) В файле styles/prosilver/theme/content.css найти

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

dl.codebox code {
	/* Also see tweaks.css */
	overflow: auto;
	display: block;
	height: auto;
	max-height: 200px;
	white-space: normal;
	padding-top: 5px;
	font: 0.9em Monaco, "Andale Mono","Courier New", Courier, mono;
	line-height: 1.3em;
	color: #8b8b8b;
	margin: 2px 0;
}
и ЗАМЕНИТЬ на

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

dl.codebox code {
	padding: 0;
	background: inherit;
	border: none;
	font: inherit;
}

.codebox {
	padding: 3px;
	border: 1px solid #dcdcdc;
	border-radius: 8px;
	-moz-border-radius: 8px;
	-webkit-border-radius: 8px;
	margin: 0.5em 1px 0 25px;
	font-size: 1em;
}

.codebox div {
	margin-bottom: 3px;
	padding-left: 2px;
	font-size: 11px;
	font-weight: normal;
	display: block;
	color: #444;
	position: relative;
}

.codeboxright {
	margin: 0px;
	padding: 0px;
	position: absolute;
	right: 20px;
}

blockquote .codebox {
	margin-left: 0;
}

.codebox pre {
	background-color: rgba(255, 255, 255, 1.0);
	/* Also see tweaks.css */
	overflow: auto;
	/* Making preformated <pre> text wrap in CSS3, Mozilla, Opera and IE:
	   http://users.tkk.fi/~tkarvine/pre-wrap-css3-mozilla-opera-ie.html */
	white-space: pre-wrap;
	white-space: -moz-pre-wrap;
	white-space: -pre-wrap;
	white-space: -o-pre-wrap;
	word-wrap: break-word;
	height: auto;
	max-height: 200px;
	padding-top: 5px;
	font: 0.9em Monaco, "Andale Mono","Courier New", Courier, mono;
	line-height: 1.3em;
	color: #000;
	margin: 2px 0;
	-o-tab-size: 4;
	-moz-tab-size: 4;
	-webkit-tab-size: 4;
	tab-size: 4;
}

.codebox code {
	padding: 0;
	background: inherit;
	border: none;
	font: inherit;
	white-space: inherit;
	word-wrap: inherit;
	tab-size: inherit;
}

.codeboxlines {
	text-align: right;
	vertical-align: top;
}

.codeboxlinesdiv {
	color: #666;
	background-color: #EEE;
}
6.2) В файле styles/prosilver/theme/colours.css найти

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

dl.codebox code {
	color: #2E8B57;
}
и добавить ПОСЛЕ

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

dl.codebox pre {
	color: #2E8B57;
}

div.codebox pre {
	color: #2E8B57;
}
6.3) В файле styles/prosilver/theme/print.css найти

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

/* Accessibility tweaks: Mozilla.org */
.skip_link { display: none; }
и добавить ПОСЛЕ

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

/* Making preformated <pre> text wrap in CSS3, Mozilla, Opera and IE:
   http://users.tkk.fi/~tkarvine/pre-wrap-css3-mozilla-opera-ie.html */
div.codebox pre {
	white-space: pre-wrap;
	white-space: -moz-pre-wrap;
	white-space: -pre-wrap;
	white-space: -o-pre-wrap;
	word-wrap: break-word;
	-o-tab-size: 4;
	-moz-tab-size: 4;
	-webkit-tab-size: 4;
	tab-size: 4;
}
6.4) В файле styles/prosilver/template/bbcode.html найти

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

<!-- BEGIN code_open --><dl class="codebox"><dt>{L_CODE}: <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></dt><dd><code><!-- END code_open -->
<!-- BEGIN code_close --></code></dd></dl><!-- END code_close -->
и ЗАМЕНИТЬ на

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

<!-- BEGIN code_open --><div class="codebox"><div>{L_CODE}: <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></div><pre><code class="{LANGUAGE}"><!-- END code_open -->
<!-- BEGIN code_close --></code></pre></div><!-- END code_close -->
Замена тэгов "dl", "dd", "dt" на "div" необходима из-за особенностей обработки тэгов "pre", "code" в некоторых браузерах (в том числе наличия ошибок).

6.5) В файле styles/prosilver/template/overall_header.html найти и добавить ПЕРЕД

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

<script type="text/javascript">
// <![CDATA[
	var codeoldbrowser = (!('forEach' in Array.prototype) || !document.addEventListener) ? true : false;
	if (!codeoldbrowser) {
		document.write('<link rel="stylesheet" href="styles\/highlight\/styles\/vs.css" \/>');
		document.write('<script type="text\/javascript" src="styles\/highlight\/highlight.pack.js"><\/script>');
	}
	function expandCode(e) {
		var c = e.parentNode.nextSibling;
		if (c.style.maxHeight == 'none') {
			c.style.maxHeight = '200px';
			e.innerHTML = '{L_EXPAND_VIEW}';
		}
		else {
			c.style.maxHeight = 'none';
			e.innerHTML = '{L_COLLAPSE_VIEW}';
		}
	}
	function wrapCode(e,set) {
		var c = e.parentNode.nextSibling;
		if (set) {
			c.style.wordWrap = 'normal';
			c.style.whiteSpace = 'pre';
			e.innerHTML = '{L_COLLAPSE_VIEW}';
		}
		else {
			if (!(c.style.wordWrap == 'normal')){
				c.style.wordWrap = 'normal';
				c.style.whiteSpace = 'pre';
				e.innerHTML = '{L_COLLAPSE_VIEW}';
			}
			else {
				c.style.wordWrap = 'break-word';
				c.style.whiteSpace = 'pre-wrap';
				e.innerHTML = '{L_EXPAND_VIEW}';
				linesCode(e.previousSibling.previousSibling,true);
			}
		}
	}
	function linesCode(e,reset) {
		var c = e.parentNode.nextSibling.firstChild.firstChild;
		if (reset) {
			c.rows[0].cells[0].firstChild.style.display = 'none';
			e.innerHTML = '{L_HCODE_NUMERATION_ON}';
		}
		else {
			if (!(c.rows[0].cells[0].firstChild.style.display == 'none')) {
				c.rows[0].cells[0].firstChild.style.display = 'none';
				e.innerHTML = '{L_HCODE_NUMERATION_ON}';
			}
			else {
				wrapCode(e.nextSibling.nextSibling,true);
				c.rows[0].cells[0].firstChild.style.display = 'block';
				e.innerHTML = '{L_HCODE_NUMERATION_OFF}';
			}
		}
	}
	function padlinesCode(number, len) {
		var str = '' + (number+1);
		for (var i=str.length; i<=len; i++) {
			str = '0' + str;
		}
		return str;
	}
	function createlinesCode(e) {
		String.prototype.replaceAll = function(find, replace_to) {
			return this.replace(new RegExp(find, "g"), replace_to);
		}
		var code = e.innerHTML;
		if (code.charAt(code.length - 1) == '\n') code = code.slice(0, -1);
		code = code.replaceAll('\r','');
		var n = 1;
		for (var i=0; i<code.length; i++) {
			if (code.charAt(i) == '\n') n++;
		}
		var len = Math.floor(Math.log(n) / Math.log(10));
		if (len < 2) len = 2;
		var width = len + 1;
		var cl = '<table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td width="' + width + 'xm" class="codeboxlines"><div class="codeboxlinesdiv" style="display: none;">';
		for (var i=0; i<n; i++) {
			cl += padlinesCode(i,len) + '&nbsp;\n';
		}
		cl += '</div></td><td>' + code + '</td></tr></table>';
		e.innerHTML = cl;
	}
	function highlightInit() {
		if (!codeoldbrowser) {
			var boxes = document.getElementsByTagName('code');
			for (i = 0; i < boxes.length; i++) {
				switch (boxes[i].className) {
					case 'no-highlight': {
						break;
					}
					case '': {
						var hl = hljs.highlightAuto(boxes[i].innerHTML);
						boxes[i].parentNode.previousSibling.innerHTML += '<span class="codeboxright"> &nbsp;|&nbsp; {L_HCODE_HLJS_IDENTIFIED} {L_HCODE_HLJS_LANGUAGE}: ' + hl.language + '</span>';
						break;
					}
					default: {
						boxes[i].parentNode.previousSibling.innerHTML += '<span class="codeboxright"> &nbsp;|&nbsp; {L_HCODE_HLJS_LANGUAGE}: ' + boxes[i].className + '</span>';
						break;
					}
				}
			}
			hljs.initHighlighting();
			for (i = 0; i < boxes.length; i++) {
				if (boxes[i].parentNode.scrollHeight > boxes[i].parentNode.offsetHeight + 1) {
					boxes[i].parentNode.previousSibling.innerHTML += ' &middot; <a href="#" name="expandCode_' + i + '" onclick="expandCode(this); return false;">{L_EXPAND_VIEW}</a>';
				}
				boxes[i].parentNode.previousSibling.innerHTML += ' &nbsp;|&nbsp; {L_HCODE_LINES}:&nbsp;<a href="#" name="linesCode_' + i + '" onclick="linesCode(this,false); return false;">{L_HCODE_NUMERATION_ON}</a> &middot; <a href="#" name="wrapCode_' + i + '" onclick="wrapCode(this,false); return false;">{L_EXPAND_VIEW}</a>';
				createlinesCode(boxes[i]);
				boxes[i].style.width = boxes[i].offsetWidth + 'px';
			}
		}
	}
	onload_functions.push('highlightInit()');
// ]]>
</script>
6.6) В файле styles/prosilver/template/forum_fn.js найти функцию selectCode и ЗАМЕНИТЬ её код между открывающей и закрывающей фигурной скобками на

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

	// Timeout to prevent quick_quote()
	setTimeout(function() {

		// Get ID of code block
		var e;
		try {
			e = a.parentNode.nextSibling.firstChild.firstChild.rows[0].cells[1];
		} catch(err) {
			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.selectNodeContents(e);
				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();
		}
	}, 0);
7) Для стилей, основанных на prosilver, вносим следующие изменения.

7.1) В файле styles/subsilver2/theme/stylesheet.css найти

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

.codetitle {
	margin: 10px 5px 0 5px;
	padding: 2px 4px;
	border-width: 1px 1px 0 1px;
	border-style: solid;
	border-color: #A9B8C2;
	color: #333333;
	background-color: #A9B8C2;
	font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
	font-size: 0.8em;
}

.codecontent {
	direction: ltr;
	margin: 0 5px 10px 5px;
	padding: 5px;
	border-color: #A9B8C2;
	border-width: 0 1px 1px 1px;
	border-style: solid;
	font-weight: normal;
	color: #006600;
	font-size: 0.85em;
	font-family: Monaco, 'Courier New', monospace;
	background-color: #FAFAFA;
}
и ЗАМЕНИТЬ на

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

.codebox {
	direction: ltr;
	margin: 10px 5px 0 5px;
	padding: 2px 4px;
	border-width: 1px 1px 0 1px;
	border-style: solid;
	border-color: #A9B8C2;
	color: #333333;
	background-color: #A9B8C2;
	font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
	font-size: 0.8em;
	display: block;
}

.codebox div {
	margin-bottom: 3px;
	padding-left: 2px;
	display: block;
	color: #444;
	position: relative;
}

.codeboxright {
	margin: 0px;
	padding: 0px;
	position: absolute;
	right: 20px;
}

.codebox pre {
	background-color: rgba(255, 255, 255, 1.0);
	/* Also see tweaks.css */
	overflow: auto;
	/* Making preformated <pre> text wrap in CSS3, Mozilla, Opera and IE:
	   http://users.tkk.fi/~tkarvine/pre-wrap-css3-mozilla-opera-ie.html */
	white-space: pre-wrap;
	white-space: -moz-pre-wrap;
	white-space: -pre-wrap;
	white-space: -o-pre-wrap;
	word-wrap: break-word;
	height: auto;
	max-height: 200px;
	padding-top: 5px;
	padding-bottom: 5px;
	font-size: 1.2em;
	font-family: Monaco, 'Courier New', monospace;
	line-height: 1.3em;
	color: #000;
	margin: 2px 0;
	-o-tab-size: 4;
	-moz-tab-size: 4;
	-webkit-tab-size: 4;
	tab-size: 4;
}

.codebox code {
	padding: 0;
	background: inherit;
	border: none;
	font: inherit;
	white-space: inherit;
	word-wrap: inherit;
	tab-size: inherit;
}

.codeboxlines {
	text-align: right;
	vertical-align: top;
}

.codeboxlinesdiv {
	color: #666;
	background-color: #EEE;
}
7.2) В файле styles/subsilver2/template/bbcode.html найти

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

<!-- BEGIN code_open -->
<div class="codetitle"><b>{L_CODE}:</b></div><div class="codecontent">
<!-- END code_open -->

<!-- BEGIN code_close -->
</div>
<!-- END code_close -->
и ЗАМЕНИТЬ на

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

<!-- BEGIN code_open -->
<div class="codebox"><div>{L_CODE}: <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></div><pre><code class="{LANGUAGE}">
<!-- END code_open -->

<!-- BEGIN code_close -->
</code></pre></div>
<!-- END code_close -->
7.3) В файле styles/subsilver2/template/overall_header.html найти и добавить ПЕРЕД

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

<script type="text/javascript">
// <![CDATA[
	var onload_functions = new Array();
	window.onload = function()
	{
		for (var i = 0; i < onload_functions.length; i++)
		{
			eval(onload_functions[i]);
		}
	};
	function selectCode(a)
	{
		// Timeout to prevent quick_quote()
		setTimeout(function() {

			// Get ID of code block
			var e;
			try {
				e = a.parentNode.nextSibling.firstChild.firstChild.rows[0].cells[1];
			} catch(err) {
				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.selectNodeContents(e);
					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();
			}
		}, 0);
	}
// ]]>
</script>
<script type="text/javascript">
// <![CDATA[
	var codeoldbrowser = (!('forEach' in Array.prototype) || !document.addEventListener) ? true : false;
	if (!codeoldbrowser) {
		document.write('<link rel="stylesheet" href="styles\/highlight\/styles\/vs.css" \/>');
		document.write('<script type="text\/javascript" src="styles\/highlight\/highlight.pack.js"><\/script>');
	}
	function expandCode(e) {
		var c = e.parentNode.nextSibling;
		if (c.style.maxHeight == 'none') {
			c.style.maxHeight = '200px';
			e.innerHTML = '{L_EXPAND_VIEW}';
		}
		else {
			c.style.maxHeight = 'none';
			e.innerHTML = '{L_COLLAPSE_VIEW}';
		}
	}
	function wrapCode(e,set) {
		var c = e.parentNode.nextSibling;
		if (set) {
			c.style.wordWrap = 'normal';
			c.style.whiteSpace = 'pre';
			e.innerHTML = '{L_COLLAPSE_VIEW}';
		}
		else {
			if (!(c.style.wordWrap == 'normal')){
				c.style.wordWrap = 'normal';
				c.style.whiteSpace = 'pre';
				e.innerHTML = '{L_COLLAPSE_VIEW}';
			}
			else {
				c.style.wordWrap = 'break-word';
				c.style.whiteSpace = 'pre-wrap';
				e.innerHTML = '{L_EXPAND_VIEW}';
				linesCode(e.previousSibling.previousSibling,true);
			}
		}
	}
	function linesCode(e,reset) {
		var c = e.parentNode.nextSibling.firstChild.firstChild;
		if (reset) {
			c.rows[0].cells[0].firstChild.style.display = 'none';
			e.innerHTML = '{L_HCODE_NUMERATION_ON}';
		}
		else {
			if (!(c.rows[0].cells[0].firstChild.style.display == 'none')) {
				c.rows[0].cells[0].firstChild.style.display = 'none';
				e.innerHTML = '{L_HCODE_NUMERATION_ON}';
			}
			else {
				wrapCode(e.nextSibling.nextSibling,true);
				c.rows[0].cells[0].firstChild.style.display = 'block';
				e.innerHTML = '{L_HCODE_NUMERATION_OFF}';
			}
		}
	}
	function padlinesCode(number, len) {
		var str = '' + (number+1);
		for (var i=str.length; i<=len; i++) {
			str = '0' + str;
		}
		return str;
	}
	function createlinesCode(e) {
		String.prototype.replaceAll = function(find, replace_to) {
			return this.replace(new RegExp(find, "g"), replace_to);
		}
		var code = e.innerHTML;
		if (code.charAt(code.length - 1) == '\n') code = code.slice(0, -1);
		code = code.replaceAll('\r','');
		var n = 1;
		for (var i=0; i<code.length; i++) {
			if (code.charAt(i) == '\n') n++;
		}
		var len = Math.floor(Math.log(n) / Math.log(10));
		if (len < 2) len = 2;
		var width = len + 1;
		var cl = '<table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td width="' + width + 'xm" class="codeboxlines"><div class="codeboxlinesdiv" style="display: none;">';
		for (var i=0; i<n; i++) {
			cl += padlinesCode(i,len) + '&nbsp;\n';
		}
		cl += '</div></td><td>' + code + '</td></tr></table>';
		e.innerHTML = cl;
	}
	function highlightInit() {
		if (!codeoldbrowser) {
			var boxes = document.getElementsByTagName('code');
			for (i = 0; i < boxes.length; i++) {
				switch (boxes[i].className) {
					case 'no-highlight': {
						break;
					}
					case '': {
						var hl = hljs.highlightAuto(boxes[i].innerHTML);
						boxes[i].parentNode.previousSibling.innerHTML += '<span class="codeboxright"> &nbsp;|&nbsp; {L_HCODE_HLJS_IDENTIFIED} {L_HCODE_HLJS_LANGUAGE}: ' + hl.language + '</span>';
						break;
					}
					default: {
						boxes[i].parentNode.previousSibling.innerHTML += '<span class="codeboxright"> &nbsp;|&nbsp; {L_HCODE_HLJS_LANGUAGE}: ' + boxes[i].className + '</span>';
						break;
					}
				}
			}
			hljs.initHighlighting();
			for (i = 0; i < boxes.length; i++) {
				if (boxes[i].parentNode.scrollHeight > boxes[i].parentNode.offsetHeight + 1) {
					boxes[i].parentNode.previousSibling.innerHTML += ' &middot; <a href="#" name="expandCode_' + i + '" onclick="expandCode(this); return false;">{L_EXPAND_VIEW}</a>';
				}
				boxes[i].parentNode.previousSibling.innerHTML += ' &nbsp;|&nbsp; {L_HCODE_LINES}:&nbsp;<a href="#" name="linesCode_' + i + '" onclick="linesCode(this,false); return false;">{L_HCODE_NUMERATION_ON}</a> &middot; <a href="#" name="wrapCode_' + i + '" onclick="wrapCode(this,false); return false;">{L_EXPAND_VIEW}</a>';
				createlinesCode(boxes[i]);
				boxes[i].style.width = boxes[i].offsetWidth + 'px';
			}
		}
	}
	onload_functions.push('highlightInit()');
// ]]>
</script>
7.4) В файле styles/subsilver2/template/viewtopic_print.html найти

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

.code, .codecontent,
и ЗАМЕНИТЬ на

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

.code, .codebox, 
затем найти

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

.forum {
и добавить ПЕРЕД

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

/* Making preformated <pre> text wrap in CSS3, Mozilla, Opera and IE:
   http://users.tkk.fi/~tkarvine/pre-wrap-css3-mozilla-opera-ie.html */
.codebox {
	white-space: pre-wrap;
	white-space: -moz-pre-wrap;
	white-space: -pre-wrap;
	white-space: -o-pre-wrap;
	word-wrap: break-word;
	-o-tab-size: 4;
	-moz-tab-size: 4;
	-webkit-tab-size: 4;
	tab-size: 4;
}
8) Очистить кэш, обновить темы.

Дополнительно, при необходимости, можно добавить:
  • выбор темы оформления подсветки кода в админстративный раздел (Общие->Конфигурация->Функции конференции->Темы Highlight.js)
  • включение/отключение автоматического определения языка (Общие->Конфигурация->Функции конференции->Автоматическое определение языка Highlight.js)
  • включение/отключение разворачивания строк кода при загрузке страницы (Общие->Конфигурация->Функции конференции->HCode - разворачивать строки)
  • включение/отключение нумерации строк кода при загрузке страницы (Общие->Конфигурация->Функции конференции->HCode - нумеровать строки)
9) В файле includes/functions.php найти

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

// The following assigns all _common_ variables that may be used at any point in a template.
и добавить ПЕРЕД

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

	if (empty($config['hljs_theme']))
	{
		set_config('hljs_theme', 'vs', false);
	}
	if (empty($config['hljs_auto']))
	{
		set_config('hljs_auto', '0', false);
	}
	if (empty($config['hljs_hcode_wrap']))
	{
		set_config('hljs_hcode_wrap', '0', false);
	}
	if (empty($config['hljs_hcode_numerate']))
	{
		set_config('hljs_hcode_numerate', '0', false);
	}
затем найти

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

		'SITE_DESCRIPTION'				=> $config['site_desc'],
и добавить ПОСЛЕ

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

		'HLJS_THEME'					=> $config['hljs_theme'],
		'HCODE_WRAP'					=> $config['hljs_hcode_wrap'],
		'HCODE_NUMERATE'				=> $config['hljs_hcode_numerate'],
10) В файле includes/acp/acp_board.php найти:

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

						'legend2'				=> 'ACP_LOAD_SETTINGS',
и добавить ПЕРЕД

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

						'hljs_theme'			=> array('lang' => 'HLJS_THEME_NAME',		'validate' => 'string',	'type' => 'text:40:255', 'explain' => true),
						'hljs_auto'				=> array('lang' => 'HLJS_AUTO',				'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
						'hljs_hcode_wrap'		=> array('lang' => 'HLJS_HCODE_WRAP',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
						'hljs_hcode_numerate'	=> array('lang' => 'HLJS_HCODE_NUMERATE',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
11) В файле includes/bbcode.php найти:

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

	function bbcode_second_pass_code($type, $code)
	{
и добавить ПОСЛЕ

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

		global $config;
затем найти

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

		// Autohighlight ON
		//if ($type == 'off')

		// Autohighlight OFF
		if (empty($type) || ($type == 'off'))

		{
			$type = 'no-highlight';
		}
и ЗАМЕНИТЬ на

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

		if ($config['hljs_auto'])
		{
			// Autohighlight ON
			if ($type == 'off')
			{
				$type = 'no-highlight';
			}
		}
		else
		{
			// Autohighlight OFF
			if (empty($type) || ($type == 'off'))
        	{
				$type = 'no-highlight';
			}
		}
12) В файле language/en/acp/board.php найти и добавить ПЕРЕД

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

// Highlight.js Themes settings
$lang = array_merge($lang, array(
	'HLJS_THEME_NAME'				=> 'HCode - Highlight.js Themes',
	'HLJS_THEME_NAME_EXPLAIN'		=> 'To change the theme to one of the included themes you need to specify the theme name here. A theme name is the name of the css file. So for github.css we enter simply: github .',
	'HLJS_AUTO'				=> 'HCode - Highlight.js Automatic language detection',
	'HLJS_AUTO_EXPLAIN'		=> 'Automatic language detection - not good idea for short code fragments. Better use custom definition.',
	'HLJS_HCODE_WRAP'				=> 'HCode - lines wrap',
	'HLJS_HCODE_WRAP_EXPLAIN'		=> 'Wrap code lines after page load.',
	'HLJS_HCODE_NUMERATE'				=> 'HCode - numerate lines',
	'HLJS_HCODE_NUMERATE_EXPLAIN'		=> 'Numerate code lines after page load.',
));
13) В файле language/ru/acp/board.php найти и добавить ПЕРЕД

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

// Highlight.js Themes settings
$lang = array_merge($lang, array(
	'HLJS_THEME_NAME'				=> 'Темы Highlight.js',
	'HLJS_THEME_NAME_EXPLAIN'		=> 'Для изменения темы Вы можете указать здесь её имя. Имя темы - это имя файла css в каталоге styles/highlight/styles. Например, для установки github.css задайте: github',
	'HLJS_AUTO'				=> 'Автоматическое определение языка Highlight.js',
	'HLJS_AUTO_EXPLAIN'		=> 'Автоматическое определение языка - не очень хорошая идея для небольших фрагментов кода. Высока вероятность ошибки.',
	'HLJS_HCODE_WRAP'				=> 'HCode - разворачивать строки',
	'HLJS_HCODE_WRAP_EXPLAIN'		=> 'Разворачивать строки кода при загрузке страницы.',
	'HLJS_HCODE_NUMERATE'				=> 'HCode - нумеровать строки',
	'HLJS_HCODE_NUMERATE_EXPLAIN'		=> 'Нумеровать строки кода при загрузке страницы.',
));
14) В файле styles/prosilver/template/overall_header.html найти

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

<link rel="stylesheet" href="styles/highlight/styles/vs.css" />
и ЗАМЕНИТЬ на

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

<link rel="stylesheet" href="styles/highlight/styles/{HLJS_THEME}.css" />
затем найти

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

			hljs.initHighlighting();
и добавить ПОСЛЕ

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

			var hcode_wrap = {HCODE_WRAP};
			var hcode_numerate = {HCODE_NUMERATE};
затем найти

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

				boxes[i].parentNode.previousSibling.innerHTML += ' &nbsp;|&nbsp; {L_HCODE_LINES}:&nbsp;<a href="#" name="linesCode_' + i + '" onclick="linesCode(this,false); return false;">{L_HCODE_NUMERATION_ON}</a> &middot; <a href="#" name="wrapCode_' + i + '" onclick="wrapCode(this,false); return false;">{L_EXPAND_VIEW}</a>';
				createlinesCode(boxes[i]);
и ЗАМЕНИТЬ на

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

				boxes[i].parentNode.previousSibling.innerHTML += ' &nbsp;|&nbsp; {L_HCODE_LINES}:&nbsp;<a href="#" name="linesCode_' + i + '" onclick="linesCode(this,false); return false;">' + (hcode_numerate ? '{L_HCODE_NUMERATION_OFF}' : '{L_HCODE_NUMERATION_ON}') + '</a> &middot; <a href="#" name="wrapCode_' + i + '" onclick="wrapCode(this,false); return false;">' + (hcode_wrap ? '{L_COLLAPSE_VIEW}' : '{L_EXPAND_VIEW}') + '</a>';
				createlinesCode(boxes[i]);
				if (hcode_wrap) wrapCode(boxes[i].parentNode.previousSibling.lastChild.previousSibling,true);
				if (hcode_numerate) linesCode(boxes[i].parentNode.previousSibling.lastChild.previousSibling.previousSibling.previousSibling,false);
15) В файле styles/subsilver2/template/overall_header.html найти

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

		document.write('<link rel="stylesheet" href="styles\/highlight\/styles\/vs.css" \/>');
и ЗАМЕНИТЬ на

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

		document.write('<link rel="stylesheet" href="styles\/highlight\/styles\/{HLJS_THEME}.css" \/>');
затем найти

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

			hljs.initHighlighting();
и добавить ПОСЛЕ

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

			var hcode_wrap = {HCODE_WRAP};
			var hcode_numerate = {HCODE_NUMERATE};
затем найти

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

				boxes[i].parentNode.previousSibling.innerHTML += ' &nbsp;|&nbsp; {L_HCODE_LINES}:&nbsp;<a href="#" name="linesCode_' + i + '" onclick="linesCode(this,false); return false;">{L_HCODE_NUMERATION_ON}</a> &middot; <a href="#" name="wrapCode_' + i + '" onclick="wrapCode(this,false); return false;">{L_EXPAND_VIEW}</a>';
				createlinesCode(boxes[i]);
и ЗАМЕНИТЬ на

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

				boxes[i].parentNode.previousSibling.innerHTML += ' &nbsp;|&nbsp; {L_HCODE_LINES}:&nbsp;<a href="#" name="linesCode_' + i + '" onclick="linesCode(this,false); return false;">' + (hcode_numerate ? '{L_HCODE_NUMERATION_OFF}' : '{L_HCODE_NUMERATION_ON}') + '</a> &middot; <a href="#" name="wrapCode_' + i + '" onclick="wrapCode(this,false); return false;">' + (hcode_wrap ? '{L_COLLAPSE_VIEW}' : '{L_EXPAND_VIEW}') + '</a>';
				createlinesCode(boxes[i]);
				if (hcode_wrap) wrapCode(boxes[i].parentNode.previousSibling.lastChild.previousSibling,linesCode(this,false); return false;true);
				if (hcode_numerate) linesCode(boxes[i].parentNode.previousSibling.lastChild.previousSibling.previousSibling.previousSibling,false);
16) Очистить кэш.


Примечания:

1) Справка по структуре блока кода

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

			// до выполнения createlinesCode
			// <div><div><a>{e}</a></div><pre><code>{code}</code></pre></div>
			//      | parentNode
        	//                           | nextSibling
        	//                                | firstChild
			createlinesCode(boxes[i]);
			// после выполнения createlinesCode
			// <div><div><a>{e}</a></div><pre><code><table><tbody><tr><td>{lines}</td><td>{code}</td></tr></tbody></table></code></pre></div>
			//      | parentNode
        	//      ---------------------| nextSibling
        	//                           -----| firstChild
			//                                ------| firstChild
			//                                      -------| firstChild
			//                                             ------| firstChild
			//                                                    ----| firstChild
			//                                                    --------------------| lastChild
			//                                      |-------------| rows[0]
			//                                      |-------------|---| cells[0] -----| cells[1]
Скачать инструкцию по установке отдельным файлом:
readme_v_0_1_5.txt
Скачать инструкцию по установке отдельным файлом:
readme_v_0_1_3.txt
Скачать инструкции по установке предыдущих версий:
readme_v_0_1_2.txt
Данный мод совместим только с современными браузерами. В IE8,7 и ниже подсветка работать не будет. Исходя из предположения, что расширенный функционал code нужен лишь разработчикам, а они обычно не используют устаревшие браузеры, мод отключается при обнаружении несовместимого браузера.

Скачать highlight.js v.7.2 и 8.0 (минимальный набор языков):
highlight.js.zip
Спасибо Shredder'у за тестирование и участие в отладке ! Мод появился в результате попытки развития мода CodeEnhancements - расширение для тега code, см. тему на конференции Shredder'а - тынц.

Тема на моей тестовой площадке - тынц, где можно посмотреть, как выглядит переработанный код и проверить работоспособность в разных браузерах. Предупреждаю: для старых браузеров мод отключен. Кое-где код javascript и css не оптимальны. Заинтересованных прошу посмотреть...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось c61 13.10.2014 7:45, всего редактировалось 6 раз.
Shredder
Former team member
Сообщения: 2266
Стаж: 17 лет 9 месяцев
Благодарил (а): 283 раза
Поблагодарили: 584 раза

Re: [BETA] HCode - расширенный функционал code

Сообщение Shredder »

c61 писал(а):Спасибо Shredder'у за тестирование и участие в отладке !
Да какое уж там тестирование :) Ну проверил в нескольких браузерах, подумаешь...
c61 писал(а): в IE8 будут глюки, а на IE ниже 8 будет ерунда
Лично у меня в IE8 вообще не работало. Жёлтые треугольники с ошибками внизу и всё - больше ничего, никакой подсветки. В IE9 и выше не проверял.
bagirovs
phpBB 1.4.4
Сообщения: 104
Стаж: 12 лет 9 месяцев
Откуда: Екатеринбург, Россия
Благодарил (а): 5 раз
Поблагодарили: 1 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение bagirovs »

У меня в Mozilla на тестовом сервере не разворачивается код.
В то время, как космические корабли бороздят просторы Вселенной...
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 13159
Стаж: 15 лет 1 месяц
Благодарил (а): 236 раз
Поблагодарили: 3750 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение Татьяна5 »

На тестовом 2 кнопки "Развернуть", одна из них рабочая
Аватара пользователя
boroda-max
phpBB 1.4.4
Сообщения: 110
Стаж: 14 лет 6 месяцев
Откуда: CCCР. Ленинград
Благодарил (а): 105 раз
Поблагодарили: 10 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение boroda-max »

Татьяна5 писал(а):На тестовом 2 кнопки "Развернуть"
там скорее всего задумка была не Нумерация · Свернуть , а Показать нумерацию · Убрать нумерацию ;)
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение c61 »

Shredder писал(а):Лично у меня в IE8 вообще не работало
Для IE8 нужен highlight 7.2, с ним работает.
bagirovs писал(а):У меня в Mozilla на тестовом сервере не разворачивается код.
Какая версия браузера ? Кэш чистили ? Сраницу обновляли ?
Татьяна5 писал(а):На тестовом 2 кнопки "Развернуть", одна из них рабочая
Первая после слова "код" относится к разворачиванию окна кода, вторая после "строки" относится к строкам, если их длина такова, что они переносяттся (аналог wrap/unwrap).
boroda-max писал(а):там скорее всего задумка была не Нумерация · Свернуть , а Показать нумерацию · Убрать нумерацию
Это мне показалось слишком длинным, поэтому оставил кратко. Вероятно, можно "Вкл.нумерацию"/"Откл.нумерацию".

Дополнено:

Учтены замечания и пожелания. Выпущена версия 0.1.3. Изменения:
  • мод отключается для всех старых браузеров (включая IE8), при этом code отображается как в немодифицированной версии за исключением обработки табуляций
  • изменено меню включения/отключения нумерации строк
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 15 лет 7 месяцев
Благодарил (а): 101 раз
Поблагодарили: 79 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение Slash »

Здравствуйте. Большое спасибо автору за данную разработку, мне очень понравилось.
Если вставить форму кода в сполер при этом подсвечивать код, например так [ code=php ], то код не отображается вообще, хотя он есть:
Изображение
Код сполера:

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

<div style="margin: 8px auto; border: 1px solid #C3CBD1; border-left-width: 2px">
<div style="background: #E9E9E6; height: 19px; font-size: 0.9em; font-weight: bold; cursor: pointer" onclick="hidn = this.parentNode.getElementsByTagName('div')[1]; btn = this.getElementsByTagName('img')[0]; if (hidn.style.display != '') { hidn.style.display = ''; [censor] = btn.src; btn.src = './images/close.gif'; } else { hidn.style.display = 'none'; btn.src = [censor]; }">
<img style="margin: 0; padding: 5px 5px 0" src="./images/open.gif" alt="BB3Spolier" />
{TEXT1}
</div>
<div style="display: none; background: #F5F5F5; border-top: 1px solid #C3CBD1; padding: 6px">
{TEXT2}
</div>
</div>
Если из самого сполера убрать display: none;, то код появится, но тут теряется смысл самого сполера...
Помогите решить проблему.
Спасибо.
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение c61 »

Выпущена версия 0.1.5. Изменения:
  • Исправлена ошибка с незакрытым тэгом td
  • Нумерация строк теперь с единицы
Raisin, Если код не виден под спойлером, попробуйте включить в админке Функции конференции -> HCode - разворачивать строки -> Да. Сообщите, пожалуйста, виден ли в этом случае код сразу после раскрытия спойлера.

Спасибо за замечания и найденные ошибки ! Ещё не всё вычищено (
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 15 лет 7 месяцев
Благодарил (а): 101 раз
Поблагодарили: 79 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение Slash »

c61 писал(а):HCode - разворачивать строки -> Да
Результат тот же.
Пробовал разные сполеры, в том числе и с Вашего форума, у Вас работает, у меня нет (я знаю, что обычно тут говорят)... - Руки совсем стали кривые....

***
В инструкции по установки настроек из админке ошибка:
11) В файле includes/acp/bbcode.php найти:
Должно быть так:
11) В файле includes/bbcode.php найти:
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение c61 »

Raisin, спасибо за найденную очепятку )

Про спойлер:
Raisin писал(а):Руки совсем стали кривые
Это не руки, это спецификации такие... Если у родительского элемента свойство display установлено в none, то у дочерних элементов offsetWidth нулевой, это корень проблемы. Если попытаться заменить dsplay на visibility c управлением высотой div, то проблему можно решить, но при свёрнутом спойлере остаётся "кусочек" содержимого. С этим можно смириться, а можно и дальше поковыряться. Вот бб-код без "доковыривания":

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

<div style="margin: 8px auto; border: 1px solid #C3CBD1; border-left-width: 2px">
<div style="background: #E9E9E6; height: 19px; font-size: 0.9em; font-weight: bold; cursor: pointer" onclick="hidn = this.parentNode.getElementsByTagName('div')[1]; btn = this.getElementsByTagName('img')[0]; if (hidn.style.visibility == 'hidden') { hidn.style.height = 'auto'; hidn.style.visibility = 'visible'; [censor] = btn.src; btn.src = '/forum/images/close.gif'; } else { hidn.style.height = '0px'; hidn.style.visibility = 'hidden'; btn.src = [censor]; }"><img style="margin: 0; padding: 5px 5px 0" src="/forum/images/open.gif" alt="BB3Spolier" />
{TEXT1}
</div>
<div style="visibility:hidden; min-height: 0px; height:0px; background: #F5F5F5; border-to: 1px solid #C3CBD1; padding: 6px;">
{TEXT2}
</div>
</div>
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 15 лет 7 месяцев
Благодарил (а): 101 раз
Поблагодарили: 79 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение Slash »

За код спасибо, я искал альтернативу display: none;

И на Вашем форуме сполер тоже использует display: none;. И у Вас код отображается! Я пробовал Ваш исходник сполера - у меня он тоже не прет... Может быть у Вас еще сторонний JavaScript к нему цепляется?
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение c61 »

Raisin писал(а):...у Вас код отображается!
Секрет фирмы ))
Если же серьёзно, код отображается тоже не шибко правильно, если не включить в админке разворачивание строк по умолчанию. Кроме того, в спойлере используются отсутствующие классы - это намеренная ошибка, но не влияющая ни на что. Ну а отличие в том, что имеется лишний оборачивающий скрытый текст div и где-то (уже не помню где) что-то умное написано в css... Честно говоря, не помню, давно было...
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 15 лет 7 месяцев
Благодарил (а): 101 раз
Поблагодарили: 79 раз

Re: [BETA] HCode - расширенный функционал code

Сообщение Slash »

Вот нашёл в Интернете спойлер, под которым код отображается, возможно кому-то понадобиться:
CSS:

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

/* animated spoiler CSS by Bloggersentral.com */
.spoilerbutton {display:block;margin:5px 0;}
.spoiler {overflow:hidden;background: #f5f5f5;}
.spoiler > div {-webkit-transition: all 0.2s ease;-moz-transition: margin 0.2s ease;-o-transition: all 0.2s ease;transition: margin 0.2s ease;}
.spoilerbutton[value="Show"] + .spoiler > div {margin-top:-100%;}
.spoilerbutton[value="Hide"] + .spoiler {padding:5px;}
HTML:

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

<input class="spoilerbutton" type="button" value="Show" onclick="this.value=this.value=='Show'?'Hide':'Show';">
<div class="spoiler"><div>
{TEXT}
</div></div>

Вернуться в «Бета-версии модов для phpBB 3.0.x»