Поиск:

Ответ в темуСоздание новой темы Создание опроса
> внедрение вставки/удалении 4-х пробелов, при нажатии "Ctrl+]"/"Ctrl+[" 
:(
    Опции темы
pythonwin
  Дата 4.10.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Всем привет!

предлагаю внедрить/установить готовый скрипт (пример работы на http://www.404.googlepages.com/indent-in-t...-zeroglif.html)

скрипт тестировался на FF/Mozilla/IE/Opera

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

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


более подробно:
http://forum.vingrad.ru/index.php?showtopi...16&view=all

код примера:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>

    
        <meta http-equiv="content-type" content="text/html; charset=windows-1250">
        <meta name="generator" content="PSPad editor, www.pspad.com">
        <script src="indent-in-textarea-by-zeroglif.js" type="text/javascript"></script>
        <style type="text/css">
        textarea {font-family:Consolas,Courier New;font-size:14px;font-weight:bold}
        </style><title>Indent-in-textarea-by-Zeroglif</title></head><body>
        <form>
            <textarea cols="80" rows="20" wrap="off">    function A(o) {
        var i = 0, a, b;
        for (; i &lt; o.length; i++) {
            if (o[i].type == 'text') {
                o[i].up = a ? (a.dn = i, b) : -1;
                o[i].onkeydown = B;
                a = o[i], b = i;
            }
        }
    }
    function B(e) {
        var t = (e = e || event).target || e.srcElement, k = e.keyCode, n;
        n = (k == 40) ? t.dn : k == 38 ? t.up : -1;
        if (n &gt;= 0) t.form.elements[n].focus();
    }
            </textarea>
        </form>
    </body></html>


код indent-in-textarea-by-zeroglif.js
Код

var ZRGLF=function(){var p='    ';function I(){E(document.getElementsByTagName('textarea')[0],'keydown',F,1);}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(){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){if(document.selection){var r=document.selection.createRange(),o=window.opera,r2,t,c='character';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'));(((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));r.moveStart(c,(!o)?t.split('\r').length-t.length-1:-t.length);r.select();}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, 13:47

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  indent_in_textarea_by_zeroglif.zip 1,63 Kb
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 4.10.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



PM WWW GTalk Jabber   Вверх
pythonwin
Дата 4.10.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Код

    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;
    /*вызываем самоё себя*/
    }();

PM WWW GTalk Jabber   Вверх
Cr@$h
Дата 5.10.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 10
Всего: 41



Полностью поддерживаю. Слежу за этими темами с самого начала. На ИЕ сам тестировал. Очень удобно для написания кода прямо на форуме.

Включите, пожалуйста, код в обработку этих комбинаций на всех форумах. Очень прошу. После внедрения я или кто-то другой хорошо, чтобы разместил новость в мире Vingrad.
Вещь полезная, и многие, уверен, сразу её оценят.
PM MAIL ICQ   Вверх
pythonwin
Дата 5.10.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Cr@$h, думаю что у админов есть сильные сомнения - нужно ли. smile

то что есть код - это полдела - нужно ещё "внедрить"! smile

Cr@$h, за поддерку спасибо!

Это сообщение отредактировал(а) pythonwin - 5.10.2006, 07:53
PM WWW GTalk Jabber   Вверх
smartov
Дата 5.10.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 10
Всего: 259



Я тоже за. Не хватает этой фичи. Не очень то удобно пробелами идентировать.
PM MAIL   Вверх
sergejzr
Дата 5.10.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 35
Всего: 360



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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
pythonwin
Дата 5.10.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(sergejzr @  5.10.2006,  19:42 Найти цитируемый пост)
Точто он сам посебе работает - хороши конечно. Вопрос в том, насколько это будет гармонировать с сущ. скриптами форума. Там и так хендлеров на поле ввода понавешено. Сделайте тестовую страничку форума и прикрепите туда скрипт. Потом тесты. Потом посмотрим...


а где можно взять эту тестовую страничку?
PM WWW GTalk Jabber   Вверх
sergejzr
Дата 5.10.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 35
Всего: 360



[Ctrl+s]


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
pythonwin
Дата 5.10.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(sergejzr @  5.10.2006,  20:08 Найти цитируемый пост)
[Ctrl+s] 

хорошо! smile

правда я JS не так хорошо знаю чтобы самому изменять код. smile
PM WWW GTalk Jabber   Вверх
sergejzr
Дата 5.10.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 35
Всего: 360



Ну кто-то должен это сделать.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Girder
Дата 5.10.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Кода много... очень много...

PS: Тем более работает он кривовато...

PS2: А вообще... что бы добавить пару пробелов(или удалить)... то в текущих скриптах енто пара строк кода(ну... чуть по больше). Но полезности в ентой возможности... имхо 0.



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
pythonwin
Дата 5.10.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Girder, ты на питоне програмировал?
PM WWW GTalk Jabber   Вверх
sergejzr
Дата 5.10.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 35
Всего: 360



Girder, если надо, то надо smile К тому же это только в питонском разделе будет вставлятся. Просто ребята должны дать готовый модульный вариант а-ля взять и поставить. А пока здесь только реализация самого алгоритма. Никто из нас адаптацией заниматься не будет..


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Girder
Дата 5.10.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(pythonwin @  5.10.2006,  14:32 Найти цитируемый пост)
Girder, ты на питоне програмировал? 
Я конечно... дико извеняюсь... а при чем здесь питон и код на форуме?  smile 



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Обсуждение форума | Следующая тема »


 




[ Время генерации скрипта: 0.1134 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.