Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   теги в выделенном фрагменте (https://javascript.ru/forum/events/30724-tegi-v-vydelennom-fragmente.html)

woojin 13.08.2012 16:31

теги в выделенном фрагменте
 
приветствую!!!

у меня задача, обернуть выделенный текст спецтегом
но есть проблема, если выделение будет начинаться и заканчиваться внутри какого то тега, тогда надо чтобы открывающийся спецтег устанавливался между тегами в выделенном фрагмента

пример::: выделение начинается после "текст2" и заканчивается после "текст6"
<p>текст1
<span>текст2
{spec}
</span>
<p>текст3</p>
<p>текст4</p>
<p>текст5</p>
<span>текст6
{/spec}
</span>
текст7
</p>
вот так вот не надо что бы было
надо что бы было так:::
<p>текст1
<span>текст2</span>
{spec}
<p>текст3</p>
<p>текст4</p>
<p>текст5</p>
{/spec}
<span>текст6</span>
текст7
</p>

и по этому поводу вопрос::: как сделать так что бы скрипт обработал текст как во втором примере

извините но я не знаю вообще как это сделать так что думаю что вы предложите какой то вариант
заранее спасибо:thanks:

P.S. теги могут быть абсолютно разными, не обязательно SPAN и P

Deff 13.08.2012 16:36

Цитата:

Сообщение от woojin
у меня задача, обернуть выделенный текст спецтегом
но есть проблема, если выделение будет начинаться и заканчиваться внутри какого то тега, тогда надо чтобы открывающийся спецтег устанавливался между тегами в выделенном фрагмента

Пример - это строка текста ? или её еще нужно извлечь из DOM ?

woojin 13.08.2012 17:56

нужно что бы скрипт срабатывал как в примере 2 и при этом ничего из DOM не надо
просто если получится как в примере 1 то поле отображения такой страницы на экране (всё между тегами {spec} заменяется на другой блок) может получится глюк а HTML структуре страницы
так и нужно чтобы была правильная вставка, которая в последствии не будет портить DOM

woojin 13.08.2012 17:57

забыл написать, обёртывание делаю вот такой функцией:::
(function($) {
  $.fn.wrapSelected = function(open, close) {
    return this.each(function() {
      var textarea = $(this);
      var value = textarea.val();
      var start = textarea[0].selectionStart;
      var end = textarea[0].selectionEnd;
      textarea.val(
        value.substr(0, start) + 
        open + value.substring(start, end) + close + 
        value.substring(end, value.length)
      );
    });
  };
})(jQuery);

woojin 13.08.2012 23:28

вот что выдал этот пример:::
<p>текст1
<span>текст2 </span>
{spec}
</p><p>текст3</p>
<p>текст4</p>
<p>текст5</p>
<span>текст6 </span>
{/spec}
текст7
<p></p>

перенос сработал отлично почти так как и хотелось, если бы не закрывающий </p> после открывающего {spec} и не открывающий <p> после "текст7"
может поможете исправить эту ошибку, я в рег.експах вообще ни фига не понимаю((((

woojin 14.08.2012 00:02

извините что непонятно, объяснил, попробую ещё раз:::
нужно чтобы выделенный текст оборачивался неким спец тегом ({spec}и{/spec}), но таким образом что бы открывающий и закрывающий спец теги не находились внутри других тегов, т.е. чтобы они к примеру не резали теги <div>, <p>, <span>, <ul> и т.д.
это нужно сделать для того чтобы в последствии обёрнутый участок текста то же был заменён, на некоторый текст (но это уже при отображении самой страницы)
в то же время {spec}и{/spec} могут находиться внутри <div>, <p>, <span>, <ul> и т.д.

так понятно?

Deff 14.08.2012 00:08

Цитата:

Сообщение от woojin
так понятно?

:-? :write: Так точно товарищь - задачка однако не из простых - думал только из span вынуть

Deff 14.08.2012 01:27

Дзен-трансгуманист,
Туть при данной постановке задачи - рекурсия не слабая -

Воть мой предыдущий код
<script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script>






<div id=div></div>

<script type="text/javascript">
var str='\
<div>текст1\n\
<span>текст2\n\
{spec}\n\
</span>\n\
<p>текст3</p>\n\
<p>текст4</p>\n\
<p>текст5</p>\n\
<span>текст6\n\
{/spec}\n\
</span>\n\
текст7\n\
</div>';

alert(str)

function Replac(str) {
  var a = document.getElementById( 'div' );

  $(a).append(str);

  var c=$(a).find("span").each(function() {
     var b = $(this).html();//alert('b='+b)
     if(b.indexOf('spec}')!=-1){ //alert(b)

	b = b.replace(/\s*(\{\/?spec\})\s*/ig,' ');
	$(this).text(b);
	$(this).after('\n'+RegExp["$1"]);
alert($(a).html())
     }

}); return $(a).html()}

alert(Replac(str))
</script>


Вынимал из span и переставлял за ним
А тут нужно смотреть оба тега - в одном ли теге - если нет то....
Вдобавок обёртка тегов <p> в теги <p> (в исходной строке) - некоректна - при любой перестановке - Dom нарушается <p - теги абзацев - они не могут перекрывать иные теги абзацов

А как получается при обрамлении <p> (а не div, как Выше

<script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script>






<div id=div></div>

<script type="text/javascript">
var str='\
<p>текст1\n\
<span>текст2\n\
{spec}\n\
</span>\n\
<p>текст3</p>\n\
<p>текст4</p>\n\
<p>текст5</p>\n\
<span>текст6\n\
{/spec}\n\
</span>\n\
текст7\n\
</p>';

alert(str)

function Replac(str) {
  var a = document.getElementById( 'div' );

  $(a).append(str);

  var c=$(a).find("span").each(function() {
     var b = $(this).html();//alert('b='+b)
     if(b.indexOf('spec}')!=-1){ //alert(b)

	b = b.replace(/\s*(\{\/?spec\})\s*/ig,' ');
	$(this).text(b);
	$(this).after('\n'+RegExp["$1"]);
alert($(a).html())
     }

}); return $(a).html()}

alert(Replac(str))
</script>
(Причём в Опере и Мозилле - траблы слегка разняться

Aetae 14.08.2012 10:48

Тк
Цитата:

Сообщение от woojin (Сообщение 197270)
(всё между тегами {spec} заменяется на другой блок

проще как-то так:
var str='\
<div>текст1\n\
<span>текст2\n\
{spec}\n\
</span>\n\
<p>текст3</p>\n\
<p>текст4</p>\n\
<p>текст5</p>\n\
<span>текст6\n\
{/spec}\n\
</span>\n\
текст7\n\
</div>';

alert(str)
function spec( str ){
	str = str.split(/\{\/?spec\}/);

	str[1] = str[1]
				.replace(/[^<>]+(?=<|$)/g,'')
				.replace(/<(\w+)[^>]*>[\s\S]*<\/\1>/g,'')
	split = str[1].search(/<\w+[^>]*>/)
	return [ 
		str[0] + str[1].substring(0,split),
		str[1].substring(split) + str[2]
	]
}

result = spec(str);
alert(result[0] + '\n{spec}\n{/spec}\n'+result[1])

woojin 14.08.2012 15:03

последний пример вот что выдал
<p>текст1
<span>текст2
</span>
{spec}
{/spec}
<span>
</span>
текст7
</p>

исчезли <p> и </p> которые были между {spec} и {/spec}

может быть поможет ещё одно пояснение::: эта штука должны срабатывать в редакторе текста в админке сайта
и просто оборачивать какой то выделенный фрагмент
затем когда страница во фронт енде отображается, то плагин производит подмену текста между спец тегами
это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо
хочется чтоб контент разблокировался сразу, без перезагрузки

woojin 14.08.2012 15:29

ещё пример, в редакторе есть текст:::
<p><strong>Позиционные селекторы</strong><br />
Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или наличия вложенных объектов, порядка следования в очереди (парные, не парные, первый элемент, последний элемент).</p>
<p>Выбор первого элемента:<br />
<span style="color: #333399;">$(«li:first»)</span> // здесь выбирается первый элемент &lt;li&gt;</p>
<p>Выбор последнего элемента:<br />
<span style="color: #333399;">$(«p:last»)</span> // здесь выбирается последний элемент p</p>
<p>Выбор каждого второго элемента начиная с 0 (индексация эллементов с нуля):<br />
<span style="color: #333399;">$(«p:even»)</span> // каждый второй параграф начиная с нулевого</p>
<p>Выбор каждого второго элемента начиная с первого:<br />
<span style="color: #333399;">$(«.mega-div:odd»)</span> // выбор каждого второго элемента с классом .mega-div начиная с первого (индексация с нуля)</p>

после выделения текста (к примеру от "элемент).</p>" и до "<p>Выбор каждого") и нажатия на кнопку добавления моих тегов, в редакторе текст должен выглядеть так:::
<p><strong>Позиционные селекторы</strong><br />
Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или наличия вложенных объектов, порядка следования в очереди (парные, не парные, первый элемент, последний элемент).</p>
{spec}
<p>Выбор первого элемента:<br />
<span style="color: #333399;">$(«li:first»)</span> // здесь выбирается первый элемент &lt;li&gt;</p>
<p>Выбор последнего элемента:<br />
<span style="color: #333399;">$(«p:last»)</span> // здесь выбирается последний элемент p</p>
<p>Выбор каждого второго элемента начиная с 0 (индексация эллементов с нуля):<br />
<span style="color: #333399;">$(«p:even»)</span> // каждый второй параграф начиная с нулевого</p>
{/spec}
<p>Выбор каждого второго элемента начиная с первого:<br />
<span style="color: #333399;">$(«.mega-div:odd»)</span> // выбор каждого второго элемента с классом .mega-div начиная с первого (индексация с нуля)</p>

т.е. получается что скрипт перенёс начло выделения после закрывающегося </p> и перед открывающимся <p>? но не факто что там будут именно "P" там (в редакторе) могут быть и другие теги
а когда этот текст уже будет на странице сайта, то он будет выглядить вот так:::
<p><strong>Позиционные селекторы</strong><br />
Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или наличия вложенных объектов, порядка следования в очереди (парные, не парные, первый элемент, последний элемент).</p>
<div>
для разблокировки и просмотра скрытого текста, пожалуйста авторизуйтесь
</div>
<p>Выбор каждого второго элемента начиная с первого:<br />
<span style="color: #333399;">$(«.mega-div:odd»)</span> // выбор каждого второго элемента с классом .mega-div начиная с первого (индексация с нуля)</p>


надеюсь так совсем понятно объяснил))))

woojin 14.08.2012 15:33

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

Aetae 14.08.2012 17:00

Так вы ничего не меняйте. Пусть люди вставляют {spec} теги как им вздумается, а правьте уже перед выводом(мой скрипт это подразумевал).
И вообще, не надо думать за пользователья - он всё равно сделает по своему.)

woojin 14.08.2012 17:16

дык как бы хочется чтобы пользователь, вообще сильно не думал

Deff 14.08.2012 17:22

woojin,
Собственно идея обрамлений несколько не так сформулированa:
Имхо так:
1. Выделенную подстроку считываем и ставим спецВыделения по началу концу выделенной строки и дополнительно и ищем теги и обрамляем все входящие в подстроку теги обратным спецвыделением

Пример
Выделили:
Цитата:

Позиционные селекторы</strong><br /> 
2	Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич

Теперь обрамляем
Цитата:

{spec}Позиционные селекторы</strong><br />
2 Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич{/spec}
Теперь делаем правильное обрамление
Цитата:

{spec}Позиционные селекторы{/spec}</strong>{spec}{/spec}<br /> {spec}
2 Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич{/spec}
Теперь можно заменять на реальные теги - к примеру
<span style="color:red"> </span>

<span style="color:red">Позиционные селекторы</span></strong><span style="color:red"></span><br /> <span style="color:red">
2	Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич</span>

Aetae 14.08.2012 17:24

Цитата:

Сообщение от woojin (Сообщение 197537)
дык как бы хочется чтобы пользователь, вообще сильно не думал

А он будет: "Почему, блеать, я выделяю от сих до сих, нажЫмаю кнопку, а он делает не так?! Сто раз пробовал!! Сломал клаву, мышь и разбил монитор!!! Ненавижу woojin'а!".)

woojin 14.08.2012 18:02

этот
Цитата:

{spec}Позиционные селекторы{/spec}</strong>{spec}{/spec}<br /> {spec}
2 Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич{/spec}
вариант не правилен
т.к. должно получиться так:
Позиционные селекторы</strong>{spec}<br />
2	Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич{/spec}

вот в таком варианте будет всё верно))))

woojin 14.08.2012 18:04

Цитата:

Сообщение от Aetae (Сообщение 197541)
А он будет: "Почему, блеать, я выделяю от сих до сих, нажЫмаю кнопку, а он делает не так?! Сто раз пробовал!! Сломал клаву, мышь и разбил монитор!!! Ненавижу woojin'а!".)

да это понятно, что он будет думать, но расчёт то не на продвинутого пользователя, на того которому сказали делй так и ни как иначе

продвинутый и так поймёт что и куда ставить

woojin 14.08.2012 18:05

Цитата:

Сообщение от woojin (Сообщение 197483)
если уж не получается сделать так как мне нужно, то хотя бы можете дать примерчик, как определить есть ли в выделенном фрагменте не открытые и не закрытые стандартные теги и соответственно поставить после и перед ними мои спец. теги

так хотя бы подскажите как сделать

Deff 14.08.2012 18:05

woojin,
Имхо - мой вариант правильней - тем паче можно одеть в реальные HTML теги со спец Классом для каждого выделения - тогда считывая теги с данным классом получаем полную последовательную строку

woojin 14.08.2012 18:10

а вот как у меня написано в 21 сообщении сделать нельзя?

Deff 14.08.2012 18:19

woojin,
Мой Вариант имхо правилен и выделено всё -что выделено пользователем!
Распарсить и получить строку просто - можно просто одеть выделенное в спец теги с классом ( приналежащим данному Выделению
<script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script>


<span class="Spec-1">Позиционные селекторы</span></strong><span class="Spec-1"></span><br /> <span class="Spec-1">
2	Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич</span>

<script type="text/javascript">
str=''
$('span.Spec-1').each(function() {
  str+=$(this).html()
});
alert(str)
</script>

Aetae 14.08.2012 18:54

Deff, классно вы работаете.=)
Так и представляю сцену с заказчиком:
- Что эта за х*ня, я же сказал, что надо то-то и то-то!
- Я считаю, что так правильней.
- А так, как написано в тз и неоднократно обсуждено нельзя?!
- Мой вариант правильный и ниипёт.

=)

Deff 14.08.2012 19:02

Aetae,
Мну не борется с Вашим Вариантом - Просто я реально подобные задачи делал и считаю, что чел плохо объясняет и не понимает до конца - что ему - нужно...

Обычно выделяем в контенте текст курсором, как то помечаем в топике и пересылаем пост с отметками на серв - так вот пометки и обрамления - нужны только на пользователе - а серву нужен выделенный кусок текста и ID соообщения...


Соль всего обсуждения - добицо правды и только правды от Автора!

(А делать иль не делать - тут не работодатели и надо мной -вообще начальников нет - я сделал - показал - выдали рекомендации, что поправить

woojin 15.08.2012 11:21

ок, спасибо сейчас попробую)))

Deff 15.08.2012 12:03

woojin,
Вы бы описали вкратце задачу - зачем/для чего - если она не секретная - наверняка путь есть короче... в лоб решать долго и не продуктивно

Aetae 15.08.2012 12:33

Deff,
перечитай тред, а? Можжно неоднократно, до полного понимания. Чел всё расписал.

woojin 15.08.2012 12:35

12 и 13 мои посты
эта штука должны срабатывать в редакторе текста в админке сайта
и просто оборачивать какой то выделенный фрагмент
затем когда страница во фронт енде отображается, то плагин производит подмену текста между спец тегами
это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо
хочется чтоб контент разблокировался сразу, без перезагрузки

а в 13 написано как бы это хотелось бы видеть в редакторе, т.к. штука для подмены во фронт енде уже есть, надо только кнопку редактора сделать

Deff 15.08.2012 12:37

Aetae,
Если Ответы удовлетворяют - он может - не пояснять!
================================================== ===
Итогового ответа - зачем нет.
Цитата:

Сообщение от woojin
у меня задача, обернуть выделенный текст спецтегом
но есть проблема, если выделение будет начинаться и заканчиваться внутри какого то тега, тогда надо чтобы открывающийся спецтег устанавливался между тегами в выделенном фрагмента

Зачем ?
Цитата:

Сообщение от woojin
затем когда страница во фронт енде отображается, то плагин производит подмену текста между спец тегами
это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо
хочется чтоб контент разблокировался сразу, без перезагрузки

Почему не послать Выделенный кусок аяксом ?

Как хочет ТС осуществлять блокировку? И как это всё будет выглядить для пользователя? Почему не накрыть выделенный текст (к примеру) прозрачкой ? - Перекрыв доступ

Aetae 15.08.2012 13:04

Потому, что он так хочет?

Я тоже предложил своё видение. Не хочет - не надо. Так как хочет он - сделать можно, но мне уже лень. Смысла усердно настаивать не вижу.
Что именно он хочет, он расписал достаточно подробно, а зачем - его личное дело.

woojin 15.08.2012 13:20

Цитата:

Сообщение от Deff (Сообщение 197728)
Зачем ?

за тем что, если текст будет блокирован таким образом то его в принципе не будет в странице
и после разблокировки (к примеру регистрации) этот блокированный текст и так с сервера будет возвращаться аяксом пользователю в браузер

а как это всё будет выглядеть на стороне пользователя описано в 13 посте

или есть ещё пост 14

Deff 15.08.2012 13:38

woojin,
А чем плохо моё предложение - обертывать включенные теги в выделенной подстроке обратным cпец выделением - тогда , по идее всё выделенное пользователем скрыто ?

Т.е от начала выделения до первого любого тега - одна скрытая подстрока - после тега - вторая скрытая подстрока - после следующего(и так до конца) N-я скрытая подстрока - скрываете все подстроки в спец тегаx - чем не устраивает ? и разбор прост до офигения (Хотя забил на тему - пофег! Посколь ТС поддержки не вижу

Aetae 15.08.2012 13:48

Цитата:

Сообщение от Deff (Сообщение 197738)
woojin,
А чем плохо моё предложение

Ну ты настырный.))))

woojin 15.08.2012 13:51

Deff,
да тем плохо что у тебя получатся по два спец тега, а требуется только один (один откр. и один закр.)
прочитай 13-й поста, там даже написано как оно выглядеть должно на сайте

а если сделать, как у тебя в примере, то тогда получится два раза "для разблокировки зарегистрируйтесь", это не правильный вариант

Deff 15.08.2012 13:54

Цитата:

Сообщение от woojin
да тем плохо что у тебя получатся по два спец тега, а требуется только один (один откр. и один закр.)

:) Я и добиваюсь ответа - чем плохо два? три -четыре - сложности с реализацией ? дык это значительно проще исправить эти сложности - нежели втыкать синтакс разбор от Дзен-трансгуманиста

Aetae 15.08.2012 14:00

Некрасиво это, блджад.

Deff 15.08.2012 14:07

Aetae,
Поправьте Вашим кодом красиво !
Цитата:

эта {spec}штука должны срабатывать в редакторе текста в админке сайта
и просто оборачивать какой то выделенный фрагмент
затем когда страница во фронт енде отображается, то плагин производит подмену текста между спец тегами
это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо
хочется чтоб контент разблокировался сразу, <div>{/spec}без перезагрузки
Что останецо от строки ?

woojin 15.08.2012 14:08

Deff,
в общем тогда придётся переписывать логику php скрипта который производит подмену, а она уже работает на УРА

woojin 15.08.2012 14:10

Цитата:

Сообщение от Deff (Сообщение 197748)
Что останецо от строки ?

что останется написано в 13-м посте

Deff 15.08.2012 14:16

woojin - Ну ждите - любой результ - вряд ли Вас удовлетворит в итоге

Цитата:

эта {spec}штука должны срабатывать в редакторе текста в админке сайта
и просто оборачивать какой то выделенный фрагмент
затем когда страница во фронтенде отображается,</p>
<p> То плагин производит подмену текста между спец тегами
это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо
хочется чтоб контент разблокировался сразу,{/spec}без перезагрузки


Часовой пояс GMT +3, время: 03:26.