Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > вставка/удаление 4-х пробелов при нажатии


Автор: pythonwin 25.9.2006, 11:59
Всем доброго времени суток!

помогите, пожалуйста сделать вставку отступов на форуме по питону!

есть определённый код - спасибо smartov, но у него есть одна ошибка которую нужно исправиль.

задача:
Цитата

А можно сделать так, чтобы при нажатии "Ctrl+]" в начало строки добавлялось 4 пробела, а при нажатии "Ctrl+[" - удалялось? Желательно чтобы это возможность работала и для целых блоков кода на питоне.


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

Единственная текущая проблема кода - то что он работает с выделением а не с линиями.

Если выделить любой один символ в середине строки и нажать Ctrl+], то пробелы будут добавляться перед этим символом, а не в начало строки.


Код:

Код

<html>
<body>
<script>
var tabSymbol;
//Change this value to needed
//tabSymbol = "    ";//tabulator
tabSymbol = "    ";//4spaces
//tabSymbol = "  ";//2 spaces
//----------
var cachedEvent;
var linesUpdated;
String.prototype.repeat = function(count) { 
    var tmp = this.valueOf();
    for (var i=1; i < count; i++)
    {
        tmp += this.valueOf();
    }
    return tmp;
};
function indentString($str)
{
    if (!$str)
        return "";
    $str_arr = $str.split(/\n/);
    for (var i=0; i < $str_arr.length; i++)
    {
        $str_arr[i] = tabSymbol + $str_arr[i];
    }
    
    linesUpdated = $str_arr.length;
    return $str_arr.join("\n");
}
function unindentString($str)
{
    if (!$str)
        return "";
    $str_arr = $str.split(/\n/);
    for (var i=0; i < $str_arr.length; i++)
    {
        if ($str_arr[i].indexOf(tabSymbol) == 0)
        {
            $str_arr[i] = $str_arr[i].replace(tabSymbol, '');
        }
    }
    linesUpdated = $str_arr.length;
    return $str_arr.join("\n");
}
function indentSelection(targetTextarea, unindent)
{
    if (document.selection) //IE, Opera 9
    {
        range = document.selection.createRange();
        range.text = unindent ? unindentString(range.text) : indentString(range.text);
    } 
    else //Mozilla
    {
        var selStart = targetTextarea.selectionStart;
        var selEnd = targetTextarea.selectionEnd;
        var selection = targetTextarea.value.substr(targetTextarea.selectionStart, targetTextarea.selectionEnd - targetTextarea.selectionStart);
        selection = unindent ? unindentString(selection) : indentString(selection);
        targetTextarea.value = targetTextarea.value.substr(0, targetTextarea.selectionStart) 
            + selection
            + targetTextarea.value.substr(targetTextarea.selectionEnd);
        
        var chars = tabSymbol.repeat(linesUpdated).length;
        selEnd = unindent ? (selEnd-chars) : (selEnd+chars);
        targetTextarea.setSelectionRange(selStart, selEnd);
    }
}
function getEvent(textarea, $event)
{
//219 - [
//221 - ]
    if (cachedEvent == 17 && $event == 219)
    {
        indentSelection(textarea, true);
        cachedEvent = 17;
        return;
    }
    if (cachedEvent == 17 && $event == 221)
    {
        indentSelection(textarea, false);
        cachedEvent = 17;
        return;
    }
    cachedEvent = $event;
}
</script>
<textarea id="asd" style="width:500px;height:500px;" onKeydown="getEvent(this, event.keyCode)">
myarray = new Array();
myarray.push('forum');
myarray.push('vingrad');
myarray.push('ru');
var str;
for (var i=0; i < count(myarray); i++)
{
str += myarray[i];//ident me;
str += '.';//ident me;
}
alert(str);
</textarea>
</body>
</html>


Более подробно:

http://forum.vingrad.ru/index.php?showtopic=108940&view=all

Автор: sergejzr 25.9.2006, 12:15
Модератор: [B]pythonwin, не следует дублировать темы![/B]

Автор: pythonwin 25.9.2006, 12:36
Цитата(sergejzr @  25.9.2006,  19:15 Найти цитируемый пост)
Модератор: pythonwin, не следует дублировать темы! 

Прошу прощения за это, но это было так задумано:
1) поместил в JS, т.к. проблему в коде могут устранить JS-ники
2) поместил в "Центр помощи", т.к. сюда заходят форумчане, у которых есть свободное время + есть желание помочь ближнему. smile
3) устал нажимать 4 пробела в форуме по питону smile - решение вынести проблему из "обсуждения форума" было обосновано, тем что разработка в "27" остановилась, а проблема тормозит развитие форума по Python. smile

Автор: pythonwin 25.9.2006, 12:53
решение этой проблемы поможет развитию форума по питону! smile

Автор: Cr@$h 26.9.2006, 19:50
Так или иначе, обсуждение реализации лучше делать в одном месте и лучше в Обсуждении ИМХО. smile 

Автор: Sardar 26.9.2006, 21:31
Нужно селекцией добежать до начала строки, затем как было, разбить по строкам добавить пробелы. Для мозиллы просто, бежим с selectionStart пока не упрёмся в \n (10). Для ИЕ геморно, вчера вечером игрался, так и не порешал безглючно.

Что бы к форуму прикрутить быстро нужно пользовать TextAreaSelectionHelper и HotKeyHandler обьекты. Пример на хоткеи:

Код
HotKeyHandler.keys = {
 //добавляем эти две строки в уже существующий .keys
 "\u00FB": function() { post.indentBlock("    "); },  //ctrl+[
 "\u00FD": function() { post.unindentBlock(); }  //ctrl+]
};


В TextAreaSelectionHelper добавляем два метода indentBlock и unindentBlock. Это кривое ad-hoc решение, т.к. никогда не думал что в TextAreaSelectionHelper потребуеться копировать селекцию. Копия (скрытая, виртуальная, называй как хочешь) селекция нужна для работы с текстом, не меняя позиции реального курсора.

Каркас indent может выглядеть так:
Код
TextAreaSelectionHelper.prototype.indentBlock = function(indchrs) {
  if(this.iesel&&(window.opera || this.iesel.parentElement()==this.target)) {
     //здесь код для IE и опера (те кто поддерживает document.selection)
     //this.iesel - TextRange настоящей селекции, при работе нужно делать .duplicate()
  } else if(this.start>=0&&this.end>=this.start) {
     //mozilla code
     //здесь доступны this.start - начало селекции, this.end - конец селекции в символах
     //this.start нужно отодвинуть до начала строки, просто перебором символов
     //из this.target.value.charAt(this.start--)

     // в мозилле с текстом работаем так:
     var left=this.target.value.substring(0,this.start);  //текст до курсора/селекции
     var right=this.target.value.substr(this.end); //текст после курсора/селекции
     var scont=this.target.value.substring(this.start, this.end); //пусто или отселектированный текст

      //бьём scount по линиям, добавляем префикс indchrs, ставим
      this.target.value=left+scont+right;
      this.target.scrollTop=this.scroll; //необходимо, иначе прыгнем вверх/вниз
      this.target.focus(); //возвращаем фокус если убежал
  }
}


unindentBlock делаем точно также. Редизайном TextAreaSelectionHelper займусь позже (когда найду время smile ).

Собстно для ИЕ глючный может быть таким, читать коменты почему в простых текстовых приложениях docment.selection не рулит (но рулит когда работаем вообще с документом):

Код
//сие предназначено на место комента "здесь код для IE и опера..."
      //Узнать находимся ли мы на новой строке можно только одним способом:
      //пройти назад и посмотреть не лежит ли там символ \r. Символ \n сьедаеться ИЕ полностью.
      //Но! если мы находимся в начале текста (перед первым символом), то поход
      //назад вынесет селекцию из textarea. Эту жуткую хрень тоже надо обрабатывать.
      
      var d = document.getElementById("dbg");
      
      if(this.iesel.text.length == 0) {
          d.innerHTML+="<br>empty";
          var check = this.iesel.duplicate();
          check.moveStart("character", -1);
          if(check.parentElement() != this.target) {//[censored 2] , мы в начале текста!
              d.innerHTML+="<br>fixbegin";
              this.iesel.text = indchrs;
              return;
          } else this.iesel = check;
          d.innerHTML+="<br>on empty sel len: "+check.text.length;
          if(check.text.length == 0)
              check.moveStart("character", -1);
      }
      
      //мы точно имеем минимум 1 символ в селекции, но может быть это \r из предидущей строки
      var ch;
      while(((ch = this.iesel.text.charAt(0)) != '\r' && ch != '\n')) {
          d.innerHTML+="<br>charback: "+ch+", "+ch.charCodeAt(0);
          //двигаем селекцию, но тут кроеться лажа, если мы дойдём до начала текста,
          //то наша селекция может "выпасть" за пределы текстового поля.
          //грёбанные ИЕ программисты, ну нахрена так усложнять то?
          var temp = this.iesel.duplicate(); //ж сколько памяти хавает наверное...
          if(temp.moveStart("character", -1) == 0) break; //хорошо бы тут остановиться, но селекция в ИЕ пойдёт дальше, это условие на моей машине никогда не отрабатывает
          if(temp.parentElement() != this.target) break; //млин таки вылезли за текстовое поле, нафих всё отрубаем
          this.iesel = temp;
      }
      
      //если первый символ это \r, значит мы в середине текста
      if((ch = this.iesel.text.charAt(0)) == '\r' || ch == '\n') {
          d.innerHTML+="<br>forward to suppress line";
          this.iesel.moveStart("character", 1);
      }
      
      //и так у нас есть целиком текст, который можно отодвинуть блоко      
      var lines = this.iesel.text.split(/\n/);
      for (var i=0; i<lines.length; i++)
          lines[i] = indchrs + lines[i];
      this.iesel.text = lines.join("\n");


Сильно не пинать ибо спал вчера 4 часа (сегодня 6, голова гудит...  smile ), а в такой нирване я бывает мыслю не адекватно smile

Автор: pythonwin 27.9.2006, 06:37
Цитата(Cr@$h @  27.9.2006,  02:50 Найти цитируемый пост)
Так или иначе, обсуждение реализации лучше делать в одном месте и лучше в Обсуждении ИМХО. smile  

я был вынужден создать ещё темы на разных подфорумах, т.к. в обсуждении тема перестала развиваться. smile + smartov, разрешил размещать код где угодно smile

Добавлено @ 06:39 
Sardar, а есть полный код, чтобы я его потестировал? smile

Автор: Cr@$h 27.9.2006, 08:49
Цитата(pythonwin @  27.9.2006,  07:37 Найти цитируемый пост)
я был вынужден создать ещё темы на разных подфорумах, т.к. в обсуждении тема перестала развиваться.  + smartov, разрешил размещать код где угодно 

Хорошо, давайте добивать код в JS.

Автор: pythonwin 27.9.2006, 11:05
Цитата(Cr@$h @  27.9.2006,  15:49 Найти цитируемый пост)

Хорошо, давайте добивать код в JS.

Ура, администрация одобрила! smile
 smile 

Автор: Sardar 27.9.2006, 13:11
Цитата(pythonwin @  27.9.2006,  05:37 Найти цитируемый пост)
Sardar, а есть полный код, чтобы я его потестировал?

Да какой полный код, мозилловскую часть напишет любой студент (не напишите сами, сделаю я, но позже). ИЕ'шную часть выложил выше, криво ибо набросок. Ссылкой http://sardar.vingrad.ru/vingradattaches/Vingrad_indent/Vingrad_indent.htm, открываем в IE, ctrl+[ отодвигает как напоминание "не юзать" smile

Автор: Cr@$h 27.9.2006, 20:08
Цитата(pythonwin @  27.9.2006,  12:05 Найти цитируемый пост)
Ура, администрация одобрила!

Скорее, я. smile  Когда код будет готов и отлажен, его нужно будет попросить поставить на обработку этих комбинаций клавиш. Это непременно полезно для всех тематических форумов. Уверен, многих, кто пишет прямо здесь, задалбывает ставить 4 пробела. Идея хорошая, а раз темы по ней ещё живы, значит перспективы радужные. smile Я надеюсь.

Автор: pythonwin 28.9.2006, 07:44
Цитата(Cr@$h @  28.9.2006,  03:08 Найти цитируемый пост)
Уверен, многих, кто пишет прямо здесь, задалбывает ставить 4 пробела.

Согласен! я - один из них. smile

Автор: Cr@$h 28.9.2006, 21:28
Как дело придвигается?

Автор: pythonwin 29.9.2006, 07:58
Цитата(Cr@$h @  29.9.2006,  04:28 Найти цитируемый пост)
Как дело придвигается? 

уже потестировал и сейчас напишу результаты.

Добавлено @ 08:03 
Sardar, потестировал есть несколько багов:
1) по условию:
Цитата(pythonwin @  25.9.2006,  18:59 Найти цитируемый пост)

А можно сделать так, чтобы при нажатии "Ctrl+]" в начало строки добавлялось 4 пробела, а при нажатии "Ctrl+[" - удалялось? Желательно чтобы это возможность работала и для целых блоков кода на питоне.


а в реальности при нажатии "Ctrl+[" пробелы добавляются, хотя должны удаляться smile
2) если выделить блок (одна и более строк) и нажать "Ctrl+[", то после добавления пробелов строка ниже блока перемещается в конец последней строки выделеного блока, который сдвигали.

smile

Автор: Zeroglif 29.9.2006, 10:07
Набросал под IE6/OP9 only - http://www.404.googlepages.com/indent_in_textarea.html

- Отступы = 4 пробела.
- Добавляем отступы с помощью TAB или Ctrl+], удаляем с помошью SHIFT+TAB или CTRL+[.
- Если выделения нет, то и блока нет, просто добавляем/удаляем отступы слева от курсора.
- Если выделение есть, то появляется блок, расширяем блок влево (то есть можно не выделять строку полностью).
- Выделение постоянно на виду (мне так удобнее).

Отпишитесь пока, то или не то по функционалу, дальше будем в приличный вид приводить и проч.


Автор: pythonwin 29.9.2006, 10:59
Цитата(Zeroglif @  29.9.2006,  17:07 Найти цитируемый пост)
- Добавляем отступы с помощью TAB или Ctrl+], удаляем с помошью SHIFT+TAB или CTRL+[.


Zeroglif, табы нельзя - только Ctrl+] и CTRL+[


Цитата(Zeroglif @  29.9.2006,  17:07 Найти цитируемый пост)
Набросал под IE6/OP9 only - http://www.404.googlepages.com/indent_in_textarea.html

спасибо, - потестирую! smile

Добавлено @ 11:06 
Цитата(Zeroglif @  29.9.2006,  17:07 Найти цитируемый пост)
- Если выделения нет, то и блока нет, просто добавляем/удаляем отступы слева от курсора.

это не правильно smile нужно добвлять/удалять пробеля в НАЧАЛЕ СТРОКИ smile

а также, если выделить блок (одна и более строк) и нажать "Ctrl+]" или "Ctrl+[", то после добавления/удаления пробелов строка ниже блока перемещается в конец последней строки выделеного блока, который сдвигали

Автор: Zeroglif 29.9.2006, 11:35
Цитата(pythonwin @  29.9.2006,  10:59 Найти цитируемый пост)
Zeroglif, табы нельзя - только Ctrl+] и CTRL+[


Цитата(pythonwin @  29.9.2006,  10:59 Найти цитируемый пост)
это не правильно  нужно добвлять/удалять пробеля в НАЧАЛЕ СТРОКИ


То есть это не должно быть похоже на обычное поведение текстового редактора для TAB/SHIFT+TAB? Где бы ни был курсор - нужно сдвигать всю строку на котрой курсор? Это можно сделать.

Цитата(pythonwin @  29.9.2006,  10:59 Найти цитируемый пост)
а также, если выделить блок (одна и более строк) и нажать "Ctrl+]" или "Ctrl+[", то после добавления/удаления пробелов строка ниже блока перемещается в конец последней строки выделеного блока, который сдвигали


Не наблюдаю. При выделении (любом) должны двигаться строки, в которых живёт это выделение. Или тут тоже своя специфика? 

Автор: Zeroglif 29.9.2006, 11:52
Без кнопок TAB/SHIFT+TAB и простой курсор в строке тоже считает эту строку блоком (поведение как при выделении):
http://www.404.googlepages.com/indent_in_textarea_no_tab.html

Автор: pythonwin 29.9.2006, 12:13
Цитата(Zeroglif @  29.9.2006,  18:52 Найти цитируемый пост)
Без кнопок TAB/SHIFT+TAB и простой курсор в строке тоже считает эту строку блоком (поведение как при выделении):
http://www.404.googlepages.com/indent_in_t...rea_no_tab.html 

1) нужно сделать так чтобы после нажатия Ctrl+] или Ctrl+[ строка или блок которую "сдвигают" после "сдвига" полностью выделялись smile

Цитата(Zeroglif @  29.9.2006,  18:35 Найти цитируемый пост)


Не наблюдаю. При выделении (любом) должны двигаться строки, в которых живёт это выделение. Или тут тоже своя специфика? 

это баг:
Цитата(pythonwin @  29.9.2006,  17:59 Найти цитируемый пост)

а также, если выделить блок (одна и более строк) и нажать "Ctrl+]" или "Ctrl+[", то после добавления/удаления пробелов строка ниже блока перемещается в конец последней строки выделеного блока, который сдвигали

нужно чтобы строка следующая за выделенным блоком не перемещалась к верхней.
Эту ошибку можно повторить в IE6+ если дважды кликнуть по строке мышкой


IDLE для Python можно скачать http://python.org/2.4

Автор: Zeroglif 29.9.2006, 13:02
Цитата(pythonwin @  29.9.2006,  12:13 Найти цитируемый пост)
нужно сделать так чтобы после нажатия Ctrl+] или Ctrl+[ строка или блок которую "сдвигают" после "сдвига" полностью выделялись


smile А как просто всё начиналось... Тебе это нужно, чтобы блок удалять? Потому как это выделение (справа) никак не влияет на суть добавления отступов (слева).

Цитата(pythonwin @  29.9.2006,  12:13 Найти цитируемый пост)
нужно чтобы строка следующая за выделенным блоком не перемещалась к верхней.
Эту ошибку можно повторить в IE6+ если дважды кликнуть по строке мышкой


Я бы рад повторить ошибку, но чего-то не срастается, гадом буду, строки ниже/выше блока молчат, как партизаны. smile Подожду, пока ещё кто-нибудь объяснит, чего править. По логике работы строка НИЖЕ блока не должна вообще колыхаться при добавлении/удалении отступов к блоку, потому как все изменения в блоке происходят между строкой ВЫШЕ и левой частью выделения. и у меня ничего не колыхается.

Автор: pythonwin 29.9.2006, 13:08
Цитата(Zeroglif @  29.9.2006,  20:02 Найти цитируемый пост)

Я бы рад повторить ошибку, но чего-то не срастается, гадом буду, 

попробуй, так:
1) поставь курсор в начало строки
2) нажми Shift+End
3) нажми Ctrl+]

Это для IE

Добавлено @ 13:09 
Цитата(Zeroglif @  29.9.2006,  20:02 Найти цитируемый пост)

smile А как просто всё начиналось... 

а я и не говорил что будет просто  smile 

Автор: Zeroglif 29.9.2006, 13:33
Цитата(pythonwin @  29.9.2006,  13:08 Найти цитируемый пост)
попробуй, так


Ага, теперь вижу, щас полечим...

Автор: pythonwin 29.9.2006, 13:47
Цитата(Zeroglif @  29.9.2006,  20:33 Найти цитируемый пост)


Ага, теперь вижу, щас полечим...

Замечательно! Жду! smile

Автор: Zeroglif 30.9.2006, 21:21
Полечил... Проверяй функционал. Индент/аниндент по CTRL+]/CTRL+[. Строка выделяется полностью от начала и до конца, если в ней курсор или её зацепило выделением. Баг IE с невидимым \r в конце  обошёл. 

http://www.404.googlepages.com/indent_in_textarea_no_tab2.html

Автор: pythonwin 1.10.2006, 11:40
Цитата(Zeroglif @  1.10.2006,  04:21 Найти цитируемый пост)
Полечил... Проверяй функционал. Индент/аниндент по CTRL+]/CTRL+[. Строка выделяется полностью от начала и до конца, если в ней курсор или её зацепило выделением. Баг IE с невидимым \r в конце  обошёл. 

багов под IE6+ не нашел. smile
Zeroglif, спасибо!

теперь нужно сделать под FF и Mozilla. smile

Автор: Zeroglif 1.10.2006, 19:03
Цитата(pythonwin @  1.10.2006,  11:40 Найти цитируемый пост)
багов под IE6+ не нашел.

Радостно.

Цитата(pythonwin @  1.10.2006,  11:40 Найти цитируемый пост)
Zeroglif, спасибо

На здоровье.

Цитата(pythonwin @  1.10.2006,  11:40 Найти цитируемый пост)
теперь нужно сделать под FF и Mozilla

Я честно говоря случайно подвизался тут помогать, ибо мне стало жутко интересно, как будет выглядеть нормальная IE-реализация задачи, а вот FF меня совсем даже не греет (приколов дюже мало, не интересно), тем более, что:
Цитата(Sardar @  27.9.2006,  13:11 Найти цитируемый пост)
мозилловскую часть напишет любой студент (не напишите сами, сделаю я, но позже). 

Но набросал до кучи и для мозиллы, приколов не встретил, за исключением того, что выделение мышкой может захватывать \n строки на которой я её отпускаю, но браузер никак об этом не сигнализирует (не выделяет визуально). Может это уже известное поведение и я его (это известие) прохлопал... smile

http://www.404.googlepages.com/indent-in-textarea-by-zeroglif.html




Автор: pythonwin 2.10.2006, 08:38
Цитата(Zeroglif @  2.10.2006,  02:03 Найти цитируемый пост)

На здоровье.

я думаю что это не всё smile +1

Добавлено @ 08:41 
Zeroglif, спа
Цитата(Zeroglif @  2.10.2006,  02:03 Найти цитируемый пост)

Но набросал до кучи и для мозиллы, приколов не встретил, за исключением того, что выделение мышкой может захватывать \n строки на которой я её отпускаю, но браузер никак об этом не сигнализирует (не выделяет визуально). Может это уже известное поведение и я его (это известие) прохлопал... smile

http://www.404.googlepages.com/indent-in-t...y-zeroglif.html

спасибо, - потестирую! smile

Этот пример работает и для IE, FF, Opera и Mozilla?

Добавлено @ 08:43 
Цитата(pythonwin @  2.10.2006,  15:38 Найти цитируемый пост)

Этот пример работает и для IE, FF, Opera и Mozilla?


Zeroglif, в IE открыл ссылку и получил какой-то набор иероглифов. smile

Автор: pythonwin 2.10.2006, 15:47
Цитата(pythonwin @  2.10.2006,  15:38 Найти цитируемый пост)
Zeroglif, в IE открыл ссылку и получил какой-то набор иероглифов. smile

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

Автор: Zeroglif 2.10.2006, 15:58
Цитата(pythonwin @  2.10.2006,  08:38 Найти цитируемый пост)
Этот пример работает и для IE, FF, Opera и Mozilla?

Да.

Цитата(pythonwin @  2.10.2006,  15:47 Найти цитируемый пост)
баловался с разными кодировками

В textarea мусор или вместо страницы мусор? Там шрифты заданы, может из-за этого... или googlepages плющит (бывает, он же в бете). Я переложу попозже.

Автор: pythonwin 2.10.2006, 16:22
Цитата(Zeroglif @  2.10.2006,  22:58 Найти цитируемый пост)

В textarea мусор или вместо страницы мусор?

вместо страницы мусор


Цитата(Zeroglif @  2.10.2006,  22:58 Найти цитируемый пост)
Там шрифты заданы

какие?

Цитата(Zeroglif @  2.10.2006,  22:58 Найти цитируемый пост)
или googlepages плющит (бывает, он же в бете)


http://www.404.googlepages.com/indent-in-textarea-by-zeroglif.html нормально открывает в FF и Mozilla, но в IE вместо странички выдает иероглифы smile

Добавлено @ 16:35 
Zeroglif, http://www.404.googlepages.com/indent-in-textarea-by-zeroglif.html - заработало! smile

Автор: Cr@$h 2.10.2006, 16:47
У меня на ИЕ 6+ всё идеально.

Автор: pythonwin 2.10.2006, 16:58
Цитата(Cr@$h @  2.10.2006,  23:47 Найти цитируемый пост)
У меня на ИЕ 6+ всё идеально. 

у меня IE6+ и багов уже не вижу. smile

Добавлено @ 17:06 
надо ещё и под под оперой потестировать, но я оперой не пользуюсь и поэтому многих тонкостей не знаю - вопрос:

"Кто сможет потестировать под оперой?"

Автор: Cr@$h 2.10.2006, 17:11
Цитата(pythonwin @  2.10.2006,  17:58 Найти цитируемый пост)
"Кто сможет потестировать под оперой?" 

Я, вечером.

Автор: pythonwin 2.10.2006, 17:21
Цитата(Cr@$h @  3.10.2006,  00:11 Найти цитируемый пост)

Я, вечером.

хорошо! smile

Автор: pythonwin 3.10.2006, 14:36
Цитата(Cr@$h @  3.10.2006,  00:11 Найти цитируемый пост)

Я, вечером. 

Какие результаты? smile

Автор: S.A.P. 3.10.2006, 14:41
pythonwin, плачевные  smile . В опере ctrl [ и ctrl ] - это переход взад/вперед.

Автор: pythonwin 3.10.2006, 14:47
Цитата(S.A.P. @  3.10.2006,  21:41 Найти цитируемый пост)
pythonwin, плачевные  smile . В опере ctrl [ и ctrl ] - это переход взад/вперед. 

smile  
S.A.P., спасибо!
тогда можно будет для оперы их заменить на что-то другое.

Добавлено @ 14:53 
чем можно заменить в опере "Ctrl + ]" и "Ctrl + ["?

Автор: Zeroglif 3.10.2006, 15:07
Цитата(pythonwin @  3.10.2006,  14:47 Найти цитируемый пост)
чем можно заменить в опере "Ctrl + ]" и "Ctrl + ["?

Чем угодно в настройках горячих клавиш Оперы. Это уже проблема пользователя. Или хочешь пользоваться привычными клавишами Оперы или привычными клавишами индента. smile 

Автор: pythonwin 3.10.2006, 15:14
Цитата(Zeroglif @  3.10.2006,  22:07 Найти цитируемый пост)

Чем угодно в настройках горячих клавиш Оперы. Это уже проблема пользователя. Или хочешь пользоваться привычными клавишами Оперы или привычными клавишами индента.

т.е. предлагаешь пользователям перенастроить в опере горячие клавиши?

Автор: Zeroglif 3.10.2006, 15:32
К примеру, в в Опере клавиши CTRL+J настроены на Ссылки на странице, а здесь, на форуме - это тег движущегося текста. Мне нужно просить винград переделать шорткат этого тега? Не думаю.

Автор: pythonwin 3.10.2006, 15:35
Цитата(Zeroglif @  3.10.2006,  22:32 Найти цитируемый пост)
hgh 

не понял.  

Автор: Zeroglif 3.10.2006, 15:45
Цитата(pythonwin @  3.10.2006,  15:35 Найти цитируемый пост)
не понял.

Сорри за абракадабру. Энтер нажал случайно. То ли локтем, то ли головой. smile

Я тебе предлагал вариант TAB/SHIFT+TAB, будет в опере работать без изменения горячих клавиш. Но проще настроить Оперу. smile

Автор: pythonwin 3.10.2006, 16:57
Цитата(Zeroglif @  3.10.2006,  22:45 Найти цитируемый пост)

Сорри за абракадабру. Энтер нажал случайно. То ли локтем, то ли головой. smile

Бывает!  smile 
Цитата(Zeroglif @  3.10.2006,  22:45 Найти цитируемый пост)

Я тебе предлагал вариант TAB/SHIFT+TAB, будет в опере работать без изменения горячих клавиш. Но проще настроить Оперу. smile


Zeroglif, спасибо! я тебя понял! smile

Cr@$h, что скажешь?

Автор: Cr@$h 3.10.2006, 17:07
Цитата(pythonwin @  3.10.2006,  15:36 Найти цитируемый пост)
Какие результаты? 

У меня всё работает.
Цитата(S.A.P. @  3.10.2006,  15:41 Найти цитируемый пост)
pythonwin, плачевные   . В опере ctrl [ и ctrl ] - это переход взад/вперед.

И такого не наблюдаю, всё нормально.
Цитата(Zeroglif @  3.10.2006,  16:45 Найти цитируемый пост)
 тебе предлагал вариант TAB/SHIFT+TAB

Tab в IE заставляет бегать по всем элементам страницы. ИМХО оставить как есть, зачем менять. В моей Опере почему-то всё нормально.

Автор: pythonwin 3.10.2006, 17:22
что собираем подписи и просим администрацию внедрить?

Автор: Cr@$h 3.10.2006, 17:48
Цитата(pythonwin @  3.10.2006,  18:22 Найти цитируемый пост)
что собираем подписи и просим администрацию внедрить? 

Да, теперь всё готово, ядумаю. воя идея, предлагаю тебе же и создать тему в Обсуждении. Предоставить скрипт, указать темы, где всё обсуждалось, сказать, что он оттестировался. Попросить внедрить его в обработку этих клавиш на всех форумах. Потом после внедрения напишу в новостях Винграда и на шапке Python (с разработчиками).

Автор: pythonwin 3.10.2006, 18:02
Cr@$h, Хорошо!
Но только завтра - поздно уже smile




Автор: Cr@$h 3.10.2006, 18:04
 smile Утро вечера мудренее.  smile 

Автор: pythonwin 4.10.2006, 13:46
Цитата(Cr@$h @  4.10.2006,  00:48 Найти цитируемый пост)

Да, теперь всё готово, ядумаю. воя идея, предлагаю тебе же и создать тему в Обсуждении. Предоставить скрипт, указать темы, где всё обсуждалось, сказать, что он оттестировался. Попросить внедрить его в обработку этих клавиш на всех форумах. Потом после внедрения напишу в новостях Винграда и на шапке Python (с разработчиками).

создал тему http://forum.vingrad.ru/index.php?showtopic=114892&view=findpost&p=877214


Автор: Zeroglif 4.10.2006, 14:47
Немножко прокомментировал скрипт, чтоб было понятно, если будут править, менять чего-нибудь, оптимизировать и т.п., внедрять, в общем. Всё. Пост сдал. smile

Код

    var ZRGLF = function () {
        /* собсно это и есть типа индент такой, 4 пробела, можно и 2 или 20...*/
        var p = '    ';
        /* инициализирующая функция, в ней вызов функции, прикрепляющей обработчик,
        первый аргумент - textarea, меняем его по-желанию или добавляем вызовы*/
        function I() {   
            E(document.getElementsByTagName('textarea')[0], 'keydown', F, 1);
        }
        /* функция, прикрепляющая обработчик, выглядит стрёмно, но я к ней привык
        последний параметр (s) может быть числом 1 (прикрепить) или 0 (открепить), 
        но этому скрипту это по-барабану, объяснил, чтоб не пугались, остальные 
        параметры обычные - объект, имя события, функция*/
        function E(o, e, f, s) {
            var p = '', b = ['remove', 'add', 'detach', 'attach'];
            (o[b[s]+'EventListener'] || (p = 'on', o[b[s+2]+'Event']))(p + e, f, false);
        }
        /* основная функция, в ней всё и происходит*/
        function F() {
            /* e - это объект события, он автоматом приходит в эту функцию первым аргументом,
            a - кнопки индента, b - кнопки анинтдента, n - textarea*/
            var e  = arguments[0],
                n = e.target,
                a = (e.ctrlKey && String.fromCharCode(e.keyCode).match(/^\u00FD|\]|\u042A$/i)),
                b = (e.ctrlKey && String.fromCharCode(e.keyCode).match(/^\u00FB|\[|\u0425$/i));           
            if (a || b) {
                /* если IE или Opera (они поддерживают selection)*/
                if (document.selection) {
                    var r = document.selection.createRange(), o = window.opera, r2, t, c = 'character';
                    /* идея в том, чтобы выделить ПОЛНОСТЬЮ строку (строки), где стоит курсор или где 
                    местами есть выделение, соответственно нам нужно расширить текстовый диапазон налево (направо) до
                    метки новой строки (\r в IE) или (\n в Opera) или до начала/конца textarea value. Функция работает
                    так: создаём дубликат диапазона, расширяем этот дубликат на 1 символ влево (вправо).
                    Затем запускаем цикл, который должен остановиться, когда мы или упрёмся в метку новой строки или
                    в начало (конец) textarea value. В цикле наращивается число шагов (i), на это самое число мы 
                    должны потом сдвинуть реальный диапазон (не дубликат). Параметр m - это или 'moveStart' (идём налево) 
                    или 'moveEnd' (идём направо), в первом случае шаг отрицательный, во втором - наоборот.*/                   
                    function F(m, n) {
                        var r2 = r.duplicate(), l = r.text.length, s = (n) ? -1 : 1, i = 0;
                        r2[m](c, s);
                        while (r2.text.length > l &&
                            r2.text.charAt(n || r2.text.length - 1) != ((o) ? '\n' : '\r')) {
                            l = r2.text.length;
                            r2[m](c, s);
                            i--;
                        } 
                       return i;
                    }
                    /* расширяем диапазон влево*/
                    r.moveStart(c, F('moveStart', '0'));
                    /* расширяем диапазон вправо, но предварительно определяем, не зацепили ли мы выделением скрытый
                    символ \r справа, для этого создаём дубликат, делаем шаг вправо на один символ и сразу сравниваем длины
                    текста в дубликате и текста в оригинале. Если разница = 3, то мы зацепили \r. В этом случае нам нет
                    необходимости расширять диапазон вправо, а нужно сделать один шаг влево, чтобы убрать \r из диапазона*/
                    (((r2 = r.duplicate()).moveEnd(c, 1), r2.text.length) - r.text.length != 3)
                        ? r.moveEnd(c, - F('moveEnd'))
                        : r.moveEnd(c, -1);
                    /*тут всё просто, меняем текст внутри текстового диапазона в зависимости от нажатых кнопок*/
                    r.text = (t = (b) 
                        ? r.text.split('\n' + p).join('\n').replace(eval('/^' + p + '/'), '')
                        : p + r.text.split('\n').join('\n' + p));
                    /*двигаем диапазон, для Оперы на длину нового текста, а для IE с поправкой на скрытые \r*/
                    r.moveStart(c, (!o)
                        ? t.split('\r').length - t.length - 1
                        : - t.length);
                    /*выделяем*/
                    r.select();
                /* если FF, Seamonkey и проч... (не поддерживают selection)*/
                } else {
                    /*по-моему всё более-менее понятно, выделяем вставляем, снова выделяем*/
                    var ss = 'selectionStart', se = 'selectionEnd', x = n[ss], y = n[se], l = n.value.length, z;                                   
                    x = (n[ss] = n.value.slice(0, x).lastIndexOf('\n') + 1);
                    y = (n[se] = (((z = n.value.slice(y, l)).indexOf('\n') != -1) ? y + z.indexOf('\n') : l));
                    if (a) {
                        n.value = n.value.slice(0, x) + p + n.value.slice(x, y).split('\n').join('\n' + p) + n.value.slice(y, l);
                        n[ss] = x;
                        n[se] = y + n.value.length - l;
                    } else {
                        n.value = n.value.slice(0, x) + n.value.slice(x, y).split('\n' + p).join('\n').replace(eval('/^' + p + '/'), '') + n.value.slice(y, n.value.length);                  
                        n[ss] = x;
                        n[se] = y - (l - n.value.length);
                    }               
                }
                /*отменяем стандартные действия для выбранных кнопок, Опера подглючивает*/                 
                e.preventDefault ? e.preventDefault() : e.returnValue = false;
                return false;
            }
        }
        /*вешаем обработчик на окно*/
        window.onload = I;
    /*вызываем самоё себя*/
    }();

Автор: pythonwin 4.10.2006, 15:45
Zeroglif, спасибо!
+1

Автор: 12345c 4.10.2006, 16:07
Почитал эту тему первый раз и поудивлялся - где используют такую кодировку клавиш? Обычно в редакторах (UltraEdit - пример) добавляют табы или пробелы, нажимая на клавишу Tab, если выделена строка или группа строк (выделение должно охватывать хотя бы 1 перенос строки). Удаление табов или группы пробелов - Shift+Tab.

Использование Ctrl+[ , когда курсор просто в строке - очень уж неочевидно.

Автор: GIK 4.10.2006, 16:19
А что-за конструкция в строке 15, зачем там две скобки?

Автор: pythonwin 4.10.2006, 17:14
Цитата(12345c @  4.10.2006,  23:07 Найти цитируемый пост)
Использование Ctrl+[ , когда курсор просто в строке - очень уж неочевидно. 

кому как, но питонщика например это нормально! smile
хотя возможно и в других языках используется.

12345c, сможешь внедрить этот скрипт к нам на форум?

Цитата(GIK @  4.10.2006,  23:19 Найти цитируемый пост)
А что-за конструкция в строке 15, зачем там две скобки? 

наверное - функциональное программирование в JS smile

Автор: 12345c 4.10.2006, 18:24
Скрипты JS к форуму писал Sardar, насколько я понимаю, поэтому внедрять лучше ему, чтобы не нарушить некоторые другие идеи.

Да и внедрять надо совсем не этот скрипт, а взять функционал кнопок Ж,Н,П,... и базироваться на нём. Вопросы совместимости браузеров решатся сами собой, так как имеющийся скрипт совместимый.

Потом, возникают вопросы отображения функциональности, затрагивается дизайн. И остаётся вопрос, почему обделять другие форумы и почему делать только по Ctrl+[ .

Автор: Zeroglif 4.10.2006, 19:25
Цитата(12345c @  4.10.2006,  18:24 Найти цитируемый пост)
Да и внедрять надо совсем не этот скрипт, а взять функционал кнопок Ж,Н,П,... и базироваться на нём. Вопросы совместимости браузеров решатся сами собой, так как имеющийся скрипт совместимый.

Согласен. В принципе, хозяину всего js-наполнения форума (Sardar?) удобнее перебрать скрипт под себя или даже написать свой (решение проблем IE понятны), под свою модульную систему. Клавиши оттуда вытащить и проч.
Цитата(12345c @  4.10.2006,  16:07 Найти цитируемый пост)
Почитал эту тему первый раз и поудивлялся - где используют такую кодировку клавиш? Обычно в редакторах (UltraEdit - пример) добавляют табы или пробелы, нажимая на клавишу Tab, если выделена строка или группа строк (выделение должно охватывать хотя бы 1 перенос строки). Удаление табов или группы пробелов - Shift+Tab.

Мне было тоже енто весьма удивительно, изначально я вставил в скрипт дополнительно обычную схему индента по TAB, но заказчик заругался. smile Потому убрал. Но пока сам тестил непостижимым образом привык к этому сочетанию, клавиши неплохо под руку ложатся. Более того я вдруг осознал для себя, что мне не мешает, а наоборот, помогает то, что сдвигается вся строка при одиноком курсоре, а не только правая от него часть (может я где-то в глубине души питонщик?)...
Цитата(GIK @  4.10.2006,  16:19 Найти цитируемый пост)
А что-за конструкция в строке 15, зачем там две скобки?

Какие две из шести круглых и восьми квадратных? smile

Автор: Sardar 4.10.2006, 20:24
Цитата(Zeroglif @  4.10.2006,  18:25 Найти цитируемый пост)
В принципе, хозяину всего js-наполнения форума (Sardar?) удобнее перебрать скрипт под себя или даже написать свой (решение проблем IE понятны), под свою модульную систему. Клавиши оттуда вытащить и проч.

Помимо меня писали скрипты sergej.z(транслит, подсветка, селекция и т.д.) и Girder (всё самое последнее вкусное). На досуге посмотрю, перенсу на текущие форумские скрипты.


Сейчас занят одной, на первый взгляд бесполезной, но интересной фичей - расширяю функционал TextAreaSelectionHelper'a, что бы человеческая селекция была. Для вас это может означать например ctrl+shift+T, появляються: [][/]; кусор в первом теге, пишем тег, он одновременно пишеться в обоих тегах; затем tab, курсор прыгает в текст между тегами, пишем содержимое; снова tab и мы после закрывающего тега (shift+tab - перед открывающим). Конечно многое можно на этом построить smile

Автор: pythonwin 5.10.2006, 07:14
Цитата(12345c @  5.10.2006,  01:24 Найти цитируемый пост)
И остаётся вопрос, почему обделять другие форумы и почему делать только по Ctrl+[ . 


Цитата(pythonwin @  25.8.2006,  15:24 Найти цитируемый пост)
где можно применить 4 пробела для увеличиния читабельности кода:
1) Python (обязательно - основной принцип групировки операторов)
2) JavaScript
3) HTML
4) CSS
5) PHP
6) C++
7) Pascal и Delphi


теперь почему именно Ctrl+] и Ctrl+[
1) этот набор клавиш используется в IDLE питона и поэтому писать код питона привычней Ctrl+] и Ctrl+[
2) если заменить их на табы, то осложниться жизнь у пользователей, которые пользуются Tab, для навигации

Добавлено @ 07:28 
хотя лучше, чтобы пользователь мог сам для себя настраивать горячие клавиши. smile

Автор: smartov 5.10.2006, 11:21
Zeroglif, красивый код! Здорово.

Автор: pythonwin 5.10.2006, 11:29
все кто за этот код и за внедрение его на форуме - поддержите пожалуйста http://forum.vingrad.ru/index.php?showtopic=114892

Автор: pythonwin 5.10.2006, 13:00
http://forum.vingrad.ru/index.php?showtopic=114892&view=findpost&p=878528

Цитата

Точто он сам посебе работает - хороши конечно. Вопрос в том, насколько это будет гармонировать с сущ. скриптами форума. Там и так хендлеров на поле ввода понавешено. Сделайте тестовую страничку форума и прикрепите туда скрипт. Потом тесты. Потом посмотрим...

Автор: pythonwin 5.10.2006, 13:59
http://forum.vingrad.ru/index.php?showtopic=114892&view=findpost&p=878641

Цитата(sergejzr @  5.10.2006,  20:41 Найти цитируемый пост)
Girder, если надо, то надо smile К тому же это только в питонском разделе будет вставлятся. Просто ребята должны дать готовый модульный вариант а-ля взять и поставить. А пока здесь только реализация самого алгоритма. Никто из нас адаптацией заниматься не будет.. 


Автор: 12345c 5.10.2006, 18:05
В общем, если админы согласны, то задача такая. Вырезать страницу форума со скриптами и сделать добавку наподобие кнопок "Жирный" и т.п. Результат будет в виде кнопки с квадратными скобками в ряду других. Вот кто какую работу может выполнить - выполняйте.


Первую часть работы сделал - взял страницу, скопировал скрипты, и стили для красоты, а может, и для работы важны будут. Убрал рекламный мусор. Сменил пути к скриптам. Теперь страница ничего, кроме рисунков, дополнительно не просит. Но они неважны для скриптов.

Далее, смотрим, что кнопки генерируются скриптом (function getHtml_f), а функции, вызываемые по клику кнопки, лежат в ToolMenu.js (function ubbc_wrapTags, ...) и в MyLib.js . Например

Код
TextAreaSelectionHelper.prototype.setSelectedText=
function(a,b){if(this.iesel&&(window.opera||this.iesel.parentElement()
==this.target)){if(typeof(b)=="string"){var 
l=this.iesel.text.length;this.iesel.text=a+this.iesel.text+b;this.iesel.moveEnd("character",-b.length);this.iesel.moveStart("character",-l)}else this.iesel.text=a;this.iesel.select()}else if ...
Задача - сделать подобную и согласовать то, куда её включить - в общие скрипты или в отдельный для форума по Питону. Аналогично - включение кнопки вставки отступов - везде или в форум по Питону.

На основании скопированных файлов можно писать дополнение, согласовав вышеназванные вопросы.

(Заодно, я в форуме по JS в своё время сделал полезный скрипт поиска по группе разделов, который стоит сейчас в приветствии. Можно распространить возможность вставки скрипта в любой форум. Для каждого будет своя группа родственных разделов. Например, в теории веб-дизайна, надо охватывать поиск по вёрстке сайтов, по работе с готовыми скриптами и прочее.)

Ещё, если касаться JS-скриптов, то разработан скрипт группового выделения опций в мультиселект-списке (лежит в разделе "Наши скрипты"). Не мешало бы его использовать при выборе области поиска на странице поиска.

Эту тему тоже можно перенести в раздел "Наши скрипты", если (и когда) автор темы пожелает.

(Где тут файл прикрепляют? не нашёл, разместил на хостинге:  http://javascript.aho.ru/files/vingradScripts.rar )

Добавлено @ 18:08 
(27 КБа в архиве, пользуйтесь, если кто будет писать скрипт, для экономии времени на обработку примера страницы.)

Автор: pythonwin 5.10.2006, 18:09
12345c, спасибо! smile

но разбираться буду завтра - поздно уже! smile

Автор: 12345c 5.10.2006, 18:26
Кстати, если использовать только в Питоне, то скрипт можно разместить в "Правилах форума", для чего достаточно обратиться к модератору. Поэтому можно вставить и сделанный скрипт, разница будет в том, что он займёт больше примерно на 1 КБа кода на обработку курсора и выделения текста в разных бр-рах. А в имеющихся скриптах эта обработка уже есть. Нужно всего 2 числа - selStart и selEnd (или как их зовут здесь), чтобы указать начало и конец выделения в textarea или есть ли оно вообще (или при равенстве чисел - указание на наличие курсора). Остальное - не более 500 байт.

Автор: pythonwin 5.10.2006, 19:10
12345c, этот скрипт можно использовать не только в питоне. smile

Автор: Cr@$h 6.10.2006, 17:34
Вот именно. Предлагаю вводить везде. Создаю опросник, который обещал.

Автор: pythonwin 9.10.2006, 11:21
Цитата(Cr@$h @  7.10.2006,  00:34 Найти цитируемый пост)
Вот именно. Предлагаю вводить везде. Создаю опросник, который обещал. 


Cr@$h, ссылку дай пожалуйста. smile

Автор: Cr@$h 10.10.2006, 00:22
http://forum.vingrad.ru/index.php?showtopic=115292

Автор: pythonwin 10.10.2006, 07:52
Цитата(Cr@$h @  10.10.2006,  07:22 Найти цитируемый пост)
Автоматизация вставки/удаления 4-х пробелов 


Cr@$h, спасибо! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)