Где убрать подстановку http://

Когда использем тег «вставить ссылку», то в итоге всегда идёт подстановка «http://»
Нужно убрать это, т.к. например вставляя dc++ ссылку (magnet) получается не совсем то что нужно.

В файле /actions/ActionTopic/add.tpl нашёл вот что:

<a href="#" onclick="voidPutURL('topic_text'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/img/link.gif" width="20" height="20"  title="вставить ссылку"></a>


Тоже не совсем то, куда копать?

33 комментария

avatar
всеравно типограф с дефолтными настройками приведет ссылку к стандартному виду
avatar
Я готов поменять, только где?
avatar

/classes/lib/external/Jevix/jevix.class.php 784-785
по-умолчанию, там:
// HTTP в начале если нет
if(!preg_match('/^http:\/\//ui', $value) && !preg_match('/^\//ui', $value))
        $value = 'http://'.$value;

поидее, если убрать замену по регулярному выражению, то http не будет добавлять. но это потенциальная бага безопасности, а значит надо расширить данный регэксп до более сложного
avatar
не не, нужно идти путём который я ниже написал
avatar

А так же
// HTTP в начале если нет
if(!preg_match('/^http:\/\//ui', $value) && !preg_match('/^\//ui', $value)) $value = 'http://'.$value;
 break;
avatar
Тьфу ты, тоесть данная операция описывается два раза.
avatar

нужно добавить в редактор кнопку — вставить магнет ссылку, потом сделать её обработку в модуле Text, а в настройках типографа(там же в модуле Text) разрешить, например, тег <magnet src="blabla">
  • ort
  • +1
avatar
Не совсем понял как сделать обработку в модуле.
avatar

по аналогии в тегом
<video>
avatar
Получилось что-то подобное:
public function MagnetParser($sText) {
	$sText = preg_replace('/<magnet>magnet:\?xt=urn:tree:tiger:(.*?)&xl=(.*?)&dn=([^\[]+)<\/magnet>/Ui', '<a href="magnet:?xt=urn:tree:tiger:$1&xl=$2&dn=$3">$3</a> ($2 байт)', $sText);
	return $sText;
	}

В итоге получаем: «turgor2.iso (4237590528 байт)».
Магнет-ссылка, которая берет название файла из строки ссылки и после ссылки в скобках добавляет размер файла в байтах, который так-же парсится с самой ссылки. Но хотелось бы довести до ума, добавив перевод имени файла в utf8 для кирилических файлов и перевод размера файла хотя-бы в мегабайты.
Кто сможет довести до ума?
avatar
function MagnetParser($sText) {
		$pattern = "/<magnet>magnet:\?xt=urn:tree:tiger:(.*?)&xl=(.*?)&dn=([^\[]+)<\/magnet>/Ui";
		$replacement = "<a href=\"magnet:?xt=urn:tree:tiger:$1&xl=$2&dn=$3\">$3</a> (".($2*1024)." Кбайт)";
        $sText = preg_replace($pattern, $replacement, $sText);
        return utf8_encode($sText);
}


Не уверен по поводу ($2*1024)
avatar
Было бы все так просто, я бы и не спрашивал :).
Оно ругается на любой параметр с "$" включенный в середине текста:
Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /usr/local/www/krasboard/www/classes/modules/sys_text/Text.class.php on line 141

В данном случае это строка с "($2*1024)".
А в конце «utf8_encode($sText);» переводит весь пост в утф, и все русские буквы превращаются в каракули. А надо, опять же, только блок "$3" с названием файла.
avatar
Я ещё подумаю))
avatar
Как вариант — распарсиваем строку — забиваем переменные, ворочаем переменные, собираем в выходную строку.
avatar
Все-равно по непонятным мне причинам ругается на переменные. Видимо проблема связана со спецификой кода движка.
avatar
Сча сделаю, дай исходную строку для скармливания ф-ии.
avatar
К примеру:
magnet:?xt=urn:tree:tiger:fwpsaf6ksqk6zxny46r74yjngnubhantctc3xay&xl=2340915200&dn=(%d0%9f%d0%be%d0%b4%d0%bc%d0%b5%d0%bd%d0%b0)(2008+bdrip+%d0%b4%d1%83%d0%b1%d0%bb%d1%8f%d0%b6).avi
avatar
как-то так
public function MagnetParser($sText) {
	preg_match('/<magnet>magnet:\?xt=urn:tree:tiger:(.*?)&xl=(.*?)&dn=([^\[]+)<\/magnet>/Ui', $sText, $matches);
	$matches[2] = ($matches[2]*1024);
	$matches[3] = utf8_encode($matches[3]);
	$sText = "<a href=\"magnet:?xt=urn:tree:tiger:{$matches[1]}&xl={$matches[2]}&dn=$3\">{$matches[3]}</a> ({$matches[2]} Кбайт)";
	return $sText;
}
avatar
С одной стороны лучше. С другой, он теперь парсит только магнеты, а остальное вообще не попадает в пост :).

Попробуй:
<b>Простая ссылка:</b>
<a href="http://www.ru">www.ru</a>.

<b>Магнет-ссылка:</b>
<magnet>magnet:?xt=urn:tree:tiger:uwb2eheowilvlnsw2j63sdk5mko4cjwwh6atboy&xl=4237590528&dn=turgor2.iso</magnet>

<b>Магнет-ссылка с кирилицей:</b>
<magnet>magnet:?xt=urn:tree:tiger:47UOM2LHA5V3T7KIKI53ZCEJUIC5ILFIFRF4CXI&xl=1920329728&dn=%D0%9D%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE%D0%B4%D0%BD%D0%B8%D0%B9+%D0%B1%D0%B5%D0%BD%D0%B5%D1%84%D0%B8%D1%81+%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0+%D0%93%D0%B0%D0%BB%D0%BA%D0%B8%D0%BD%D0%B0.2008.XVID.SatRip_by_Senator.avi</magnet>

Выдаст только 1 магнет.

Ну и касательно перевода в килобайты, наверное стоит делить а не умнажать.
А про utf8 я оговорился. Надо не конвертировать а преобразовать символы в буквы с кодировкой utf8.
avatar
С кирилицей я справился:
$matches[3] = htmlspecialchars(urldecode($matches[3]));
Теперь бы разобраться, почему он стал «поедать» части поста от этого парсера.
avatar
с этим уже хз, крути.
А по поводу деления на 1024 — да, верно, пробуксовал.
avatar
Боюсь моих знаний на это «крути» не хватит.
Будем ждать свежий подход от других добрых людей.
avatar
Для разрядности определения файла прикрутил функцию:
function format_size($size){
     $metrics[0] = 'байт';
     $metrics[1] = 'Кб';
     $metrics[2] = 'Мб';
     $metrics[3] = 'Гб';
     $metrics[4] = 'Тб';
     $metric = 0;
     while(floor($size/1024) > 0){
         ++$metric;
         $size /= 1024;
     }
     $ret =  round($size,1)." ".(isset($metrics[$metric])?$metrics[$metric]:'??');
     return $ret;
	}
И подставил
$matches[2] = format_size($matches[2]);
Теперь с размером файлов проблем нет.
avatar
ну и хорошо))
avatar
Видимо проблема в грубом присвоении переменной $sText значения результата парсера, вот тут:
$sText = "<a href=\"magnet:?xt=urn:tree:tiger:{$matches[1]}&xl={$matches[2]}&dn=$3\">{$matches[3]}</a> ({$matches[2]})";
Тем самым мы указали переменной, в которой хранится весь текст поста, значение одного только тега . Все остальное просто затирается этим действием.
avatar
В общем, решение было найдено и доведено до ума. Позже напишу инструкцию по установке хака.
avatar
нуу и… ?)
avatar
Время-деньги. Пока было некогда.
avatar
Понадобились магнет ссылки и набрел на этот топик. В общем я решил пойти совсем коротким и безгемморойным путем:

в файле /classes/lib/external/Jevix/jevix.class.php

находим строку:
if(!preg_match('/^(http|https|ftp):\/\//ui', $value) && !preg_match('/^\//ui', $value)) $value = 'http://'.$value;

и меняем ее на:

if (!preg_match('/magnet:\?xt=urn:tree:tiger:/Ui', $value))
{
if(!preg_match('/^(http|https|ftp):\/\//ui', $value) && !preg_match('/^\//ui', $value)) $value = 'http://'.$value;
}


Таким образом, кнопка link стала работать и для вставки обычных ссылок, и для вставки магнет ссылок.

Может кому поможет :)
avatar
спасибо, замучился думать что делать с вставкой магнетов для торрентов

решения выше, конечно, хороши и правильны с точки зрения движка, но зачем такой геморрой?
avatar
Почему же геморрой? По-моему, более простого варианта, не калечащего функциональность, уже и не может быть)
avatar
Магнет ссылка вставляется, но после сохранения топика выдает белый лист с текстом, при этом сам топик сохраняется:
Warning: Cannot modify header information — headers already sent by (output started at C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\engine\lib\external\Jevix\jevix.class.php:1) in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\engine\include\function.php on line 224

Warning: Cannot modify header information — headers already sent by (output started at C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\engine\lib\external\Jevix\jevix.class.php:1) in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\engine\include\function.php on line 225
Вот какой код у меня в: engine\lib\external\Jevix\jevix.class.php

					case '#link':
						// Ява-скрипт в ссылке
						if(preg_match('/javascript:/ui', $value)) {
							$this->eror('Попытка вставить JavaScript в URI');
							continue(2);
						}
						// Первый символ должен быть a-z0-9 или #!
						if(!preg_match('/^[a-z0-9\/\#]/ui', $value)) {
							$this->eror('URI: Первый символ адреса должен быть буквой или цифрой');
							continue(2);
						}
						// HTTP в начале если нет
						if (!preg_match('/magnet:\?xt=urn:tree:tiger:/Ui', $value))
						{
						if(!preg_match('/^(http|https|ftp):\/\//ui', $value) && !preg_match('/^(\/|\#)/ui', $value) && !preg_match('/^(mailto):/ui', $value) ) $value = 'http://'.$value;
						}
						break;

версия LiveStreet 0.5.1 — 30.09.2011

может я куда-то не туда вставил код или в этой версии еще где-то надо что-то исправить?
avatar
Подскажите как добавить кнопку magnet в 1.0.1 пожалуйста.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.