editarea-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/lib/editarea-rails.rb +8 -0
- data/lib/editarea-rails/version.rb +5 -0
- data/vendor/assets/images/autocompletion.gif +0 -0
- data/vendor/assets/images/close.gif +0 -0
- data/vendor/assets/images/fullscreen.gif +0 -0
- data/vendor/assets/images/go_to_line.gif +0 -0
- data/vendor/assets/images/help.gif +0 -0
- data/vendor/assets/images/highlight.gif +0 -0
- data/vendor/assets/images/load.gif +0 -0
- data/vendor/assets/images/move.gif +0 -0
- data/vendor/assets/images/newdocument.gif +0 -0
- data/vendor/assets/images/opacity.png +0 -0
- data/vendor/assets/images/plugins/charmap/charmap.gif +0 -0
- data/vendor/assets/images/plugins/test/css/test.css +3 -0
- data/vendor/assets/images/plugins/test/images/Thumbs.db +0 -0
- data/vendor/assets/images/plugins/test/images/test.gif +0 -0
- data/vendor/assets/images/plugins/test/langs/bg.js +10 -0
- data/vendor/assets/images/plugins/test/langs/cs.js +4 -0
- data/vendor/assets/images/plugins/test/langs/de.js +4 -0
- data/vendor/assets/images/plugins/test/langs/dk.js +4 -0
- data/vendor/assets/images/plugins/test/langs/en.js +4 -0
- data/vendor/assets/images/plugins/test/langs/eo.js +4 -0
- data/vendor/assets/images/plugins/test/langs/es.js +4 -0
- data/vendor/assets/images/plugins/test/langs/fr.js +4 -0
- data/vendor/assets/images/plugins/test/langs/hr.js +4 -0
- data/vendor/assets/images/plugins/test/langs/it.js +4 -0
- data/vendor/assets/images/plugins/test/langs/ja.js +4 -0
- data/vendor/assets/images/plugins/test/langs/mk.js +4 -0
- data/vendor/assets/images/plugins/test/langs/nl.js +4 -0
- data/vendor/assets/images/plugins/test/langs/pl.js +4 -0
- data/vendor/assets/images/plugins/test/langs/pt.js +4 -0
- data/vendor/assets/images/plugins/test/langs/ru.js +4 -0
- data/vendor/assets/images/plugins/test/langs/sk.js +4 -0
- data/vendor/assets/images/plugins/test/langs/zh.js +4 -0
- data/vendor/assets/images/plugins/test/test.js +110 -0
- data/vendor/assets/images/plugins/test/test2.js +1 -0
- data/vendor/assets/images/processing.gif +0 -0
- data/vendor/assets/images/redo.gif +0 -0
- data/vendor/assets/images/reset_highlight.gif +0 -0
- data/vendor/assets/images/save.gif +0 -0
- data/vendor/assets/images/search.gif +0 -0
- data/vendor/assets/images/smooth_selection.gif +0 -0
- data/vendor/assets/images/spacer.gif +0 -0
- data/vendor/assets/images/statusbar_resize.gif +0 -0
- data/vendor/assets/images/undo.gif +0 -0
- data/vendor/assets/images/word_wrap.gif +0 -0
- data/vendor/assets/javascripts/autocompletion.js +491 -0
- data/vendor/assets/javascripts/edit_area.js +527 -0
- data/vendor/assets/javascripts/edit_area_full.js +38 -0
- data/vendor/assets/javascripts/edit_area_functions.js +1202 -0
- data/vendor/assets/javascripts/edit_area_loader.js +1081 -0
- data/vendor/assets/javascripts/elements_functions.js +336 -0
- data/vendor/assets/javascripts/highlight.js +407 -0
- data/vendor/assets/javascripts/keyboard.js +145 -0
- data/vendor/assets/javascripts/langs/bg.js +54 -0
- data/vendor/assets/javascripts/langs/cs.js +48 -0
- data/vendor/assets/javascripts/langs/de.js +48 -0
- data/vendor/assets/javascripts/langs/dk.js +48 -0
- data/vendor/assets/javascripts/langs/en.js +48 -0
- data/vendor/assets/javascripts/langs/eo.js +48 -0
- data/vendor/assets/javascripts/langs/es.js +48 -0
- data/vendor/assets/javascripts/langs/fi.js +48 -0
- data/vendor/assets/javascripts/langs/fr.js +48 -0
- data/vendor/assets/javascripts/langs/hr.js +48 -0
- data/vendor/assets/javascripts/langs/it.js +48 -0
- data/vendor/assets/javascripts/langs/ja.js +48 -0
- data/vendor/assets/javascripts/langs/mk.js +48 -0
- data/vendor/assets/javascripts/langs/nl.js +48 -0
- data/vendor/assets/javascripts/langs/pl.js +48 -0
- data/vendor/assets/javascripts/langs/pt.js +48 -0
- data/vendor/assets/javascripts/langs/ru.js +48 -0
- data/vendor/assets/javascripts/langs/sk.js +48 -0
- data/vendor/assets/javascripts/langs/zh.js +48 -0
- data/vendor/assets/javascripts/manage_area.js +623 -0
- data/vendor/assets/javascripts/plugins/charmap/charmap.js +90 -0
- data/vendor/assets/javascripts/plugins/charmap/jscripts/map.js +373 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/bg.js +12 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/cs.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/de.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/dk.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/en.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/eo.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/es.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/fr.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/hr.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/it.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/ja.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/mk.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/nl.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/pl.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/pt.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/ru.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/sk.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/langs/zh.js +6 -0
- data/vendor/assets/javascripts/plugins/charmap/popup.html +24 -0
- data/vendor/assets/javascripts/plugins/test/langs/bg.js +10 -0
- data/vendor/assets/javascripts/plugins/test/langs/cs.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/de.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/dk.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/en.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/eo.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/es.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/fr.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/hr.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/it.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/ja.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/mk.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/nl.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/pl.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/pt.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/ru.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/sk.js +4 -0
- data/vendor/assets/javascripts/plugins/test/langs/zh.js +4 -0
- data/vendor/assets/javascripts/plugins/test/test.js +110 -0
- data/vendor/assets/javascripts/plugins/test/test2.js +1 -0
- data/vendor/assets/javascripts/reg_syntax.js +166 -0
- data/vendor/assets/javascripts/reg_syntax/basic.js +70 -0
- data/vendor/assets/javascripts/reg_syntax/brainfuck.js +45 -0
- data/vendor/assets/javascripts/reg_syntax/c.js +63 -0
- data/vendor/assets/javascripts/reg_syntax/coldfusion.js +120 -0
- data/vendor/assets/javascripts/reg_syntax/cpp.js +66 -0
- data/vendor/assets/javascripts/reg_syntax/css.js +85 -0
- data/vendor/assets/javascripts/reg_syntax/html.js +51 -0
- data/vendor/assets/javascripts/reg_syntax/java.js +57 -0
- data/vendor/assets/javascripts/reg_syntax/js.js +94 -0
- data/vendor/assets/javascripts/reg_syntax/pas.js +83 -0
- data/vendor/assets/javascripts/reg_syntax/perl.js +88 -0
- data/vendor/assets/javascripts/reg_syntax/php.js +157 -0
- data/vendor/assets/javascripts/reg_syntax/python.js +145 -0
- data/vendor/assets/javascripts/reg_syntax/robotstxt.js +25 -0
- data/vendor/assets/javascripts/reg_syntax/ruby.js +68 -0
- data/vendor/assets/javascripts/reg_syntax/sql.js +56 -0
- data/vendor/assets/javascripts/reg_syntax/tsql.js +88 -0
- data/vendor/assets/javascripts/reg_syntax/vb.js +53 -0
- data/vendor/assets/javascripts/reg_syntax/xml.js +57 -0
- data/vendor/assets/javascripts/regexp.js +139 -0
- data/vendor/assets/javascripts/resize_area.js +73 -0
- data/vendor/assets/javascripts/search_replace.js +174 -0
- data/vendor/assets/stylesheets/edit_area.css +530 -0
- data/vendor/assets/stylesheets/plugins/charmap/css/charmap.css +64 -0
- data/vendor/assets/stylesheets/plugins/test/css/test.css +3 -0
- metadata +210 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
editAreaLoader.lang["ru"]={
|
|
2
|
+
new_document: "новый пустой документ",
|
|
3
|
+
search_button: "поиск и замена",
|
|
4
|
+
search_command: "искать следующий / открыть панель поиска",
|
|
5
|
+
search: "поиск",
|
|
6
|
+
replace: "замена",
|
|
7
|
+
replace_command: "заменить / открыть панель поиска",
|
|
8
|
+
find_next: "найти следующее",
|
|
9
|
+
replace_all: "заменить все",
|
|
10
|
+
reg_exp: "регулярное выражение",
|
|
11
|
+
match_case: "учитывать регистр",
|
|
12
|
+
not_found: "не найдено.",
|
|
13
|
+
occurrence_replaced: "вхождение заменено.",
|
|
14
|
+
search_field_empty: "Поле поиска пустое",
|
|
15
|
+
restart_search_at_begin: "Достигнут конец документа. Начинаю с начала.",
|
|
16
|
+
move_popup: "переместить окно поиска",
|
|
17
|
+
font_size: "--Размер шрифта--",
|
|
18
|
+
go_to_line: "перейти к строке",
|
|
19
|
+
go_to_line_prompt: "перейти к строке номер:",
|
|
20
|
+
undo: "отменить",
|
|
21
|
+
redo: "вернуть",
|
|
22
|
+
change_smooth_selection: "включить/отключить некоторые функции просмотра (более красиво, но больше использует процессор)",
|
|
23
|
+
highlight: "переключить подсветку синтаксиса включена/выключена",
|
|
24
|
+
reset_highlight: "восстановить подсветку (если разсинхронизирована от текста)",
|
|
25
|
+
word_wrap: "toggle word wrapping mode",
|
|
26
|
+
help: "о программе",
|
|
27
|
+
save: "сохранить",
|
|
28
|
+
load: "загрузить",
|
|
29
|
+
line_abbr: "Стр",
|
|
30
|
+
char_abbr: "Стлб",
|
|
31
|
+
position: "Позиция",
|
|
32
|
+
total: "Всего",
|
|
33
|
+
close_popup: "закрыть всплывающее окно",
|
|
34
|
+
shortcuts: "Горячие клавиши",
|
|
35
|
+
add_tab: "добавить табуляцию в текст",
|
|
36
|
+
remove_tab: "убрать табуляцию из текста",
|
|
37
|
+
about_notice: "Внимание: функция подсветки синтаксиса только для небольших текстов",
|
|
38
|
+
toggle: "Переключить редактор",
|
|
39
|
+
accesskey: "Горячая клавиша",
|
|
40
|
+
tab: "Tab",
|
|
41
|
+
shift: "Shift",
|
|
42
|
+
ctrl: "Ctrl",
|
|
43
|
+
esc: "Esc",
|
|
44
|
+
processing: "Обработка...",
|
|
45
|
+
fullscreen: "полный экран",
|
|
46
|
+
syntax_selection: "--Синтакс--",
|
|
47
|
+
close_tab: "Закрыть файл"
|
|
48
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
editAreaLoader.lang["sk"]={
|
|
2
|
+
new_document: "nový prázdy dokument",
|
|
3
|
+
search_button: "vyhľadaj a nahraď",
|
|
4
|
+
search_command: "hľadaj ďalsšie / otvor vyhľadávacie pole",
|
|
5
|
+
search: "hľadaj",
|
|
6
|
+
replace: "nahraď",
|
|
7
|
+
replace_command: "nahraď / otvor vyhľadávacie pole",
|
|
8
|
+
find_next: "nájdi ďalšie",
|
|
9
|
+
replace_all: "nahraď všetko",
|
|
10
|
+
reg_exp: "platné výrazy",
|
|
11
|
+
match_case: "zhodujúce sa výrazy",
|
|
12
|
+
not_found: "nenájdené.",
|
|
13
|
+
occurrence_replaced: "výskyty nahradené.",
|
|
14
|
+
search_field_empty: "Pole vyhľadávanie je prádzne",
|
|
15
|
+
restart_search_at_begin: "End of area reached. Restart at begin.",
|
|
16
|
+
move_popup: "presuň vyhľadávacie okno",
|
|
17
|
+
font_size: "--Veľkosť textu--",
|
|
18
|
+
go_to_line: "prejdi na riadok",
|
|
19
|
+
go_to_line_prompt: "prejdi na riadok:",
|
|
20
|
+
undo: "krok späť",
|
|
21
|
+
redo: "prepracovať",
|
|
22
|
+
change_smooth_selection: "povoliť/zamietnúť niektoré zo zobrazených funkcií (účelnejšie zobrazenie vyžaduje väčšie zaťaženie procesora CPU)",
|
|
23
|
+
highlight: "prepnúť zvýrazňovanie syntaxe zap/vyp",
|
|
24
|
+
reset_highlight: "zrušiť zvýrazňovanie (ak je nesynchronizované s textom)",
|
|
25
|
+
word_wrap: "toggle word wrapping mode",
|
|
26
|
+
help: "o programe",
|
|
27
|
+
save: "uložiť",
|
|
28
|
+
load: "načítať",
|
|
29
|
+
line_abbr: "Ln",
|
|
30
|
+
char_abbr: "Ch",
|
|
31
|
+
position: "Pozícia",
|
|
32
|
+
total: "Spolu",
|
|
33
|
+
close_popup: "zavrieť okno",
|
|
34
|
+
shortcuts: "Skratky",
|
|
35
|
+
add_tab: "pridať tabulovanie textu",
|
|
36
|
+
remove_tab: "odstrániť tabulovanie textu",
|
|
37
|
+
about_notice: "Upozornenie: funkcia zvýrazňovania syntaxe je dostupná iba pre malý text",
|
|
38
|
+
toggle: "Prepnúť editor",
|
|
39
|
+
accesskey: "Accesskey",
|
|
40
|
+
tab: "Záložka",
|
|
41
|
+
shift: "Shift",
|
|
42
|
+
ctrl: "Ctrl",
|
|
43
|
+
esc: "Esc",
|
|
44
|
+
processing: "Spracúvam...",
|
|
45
|
+
fullscreen: "cel=a obrazovka",
|
|
46
|
+
syntax_selection: "--Vyber Syntax--",
|
|
47
|
+
close_tab: "Close file"
|
|
48
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
editAreaLoader.lang["zh"]={
|
|
2
|
+
new_document: "新建空白文档",
|
|
3
|
+
search_button: "查找与替换",
|
|
4
|
+
search_command: "查找下一个 / 打开查找框",
|
|
5
|
+
search: "查找",
|
|
6
|
+
replace: "替换",
|
|
7
|
+
replace_command: "替换 / 打开查找框",
|
|
8
|
+
find_next: "查找下一个",
|
|
9
|
+
replace_all: "全部替换",
|
|
10
|
+
reg_exp: "正则表达式",
|
|
11
|
+
match_case: "匹配大小写",
|
|
12
|
+
not_found: "未找到.",
|
|
13
|
+
occurrence_replaced: "处被替换.",
|
|
14
|
+
search_field_empty: "查找框没有内容",
|
|
15
|
+
restart_search_at_begin: "已到到文档末尾. 从头重新查找.",
|
|
16
|
+
move_popup: "移动查找对话框",
|
|
17
|
+
font_size: "--字体大小--",
|
|
18
|
+
go_to_line: "转到行",
|
|
19
|
+
go_to_line_prompt: "转到行:",
|
|
20
|
+
undo: "恢复",
|
|
21
|
+
redo: "重做",
|
|
22
|
+
change_smooth_selection: "启用/禁止一些显示特性(更好看但更耗费资源)",
|
|
23
|
+
highlight: "启用/禁止语法高亮",
|
|
24
|
+
reset_highlight: "重置语法高亮(当文本显示不同步时)",
|
|
25
|
+
word_wrap: "toggle word wrapping mode",
|
|
26
|
+
help: "关于",
|
|
27
|
+
save: "保存",
|
|
28
|
+
load: "加载",
|
|
29
|
+
line_abbr: "行",
|
|
30
|
+
char_abbr: "字符",
|
|
31
|
+
position: "位置",
|
|
32
|
+
total: "总计",
|
|
33
|
+
close_popup: "关闭对话框",
|
|
34
|
+
shortcuts: "快捷键",
|
|
35
|
+
add_tab: "添加制表符(Tab)",
|
|
36
|
+
remove_tab: "移除制表符(Tab)",
|
|
37
|
+
about_notice: "注意:语法高亮功能仅用于较少内容的文本(文件内容太大会导致浏览器反应慢)",
|
|
38
|
+
toggle: "切换编辑器",
|
|
39
|
+
accesskey: "快捷键",
|
|
40
|
+
tab: "Tab",
|
|
41
|
+
shift: "Shift",
|
|
42
|
+
ctrl: "Ctrl",
|
|
43
|
+
esc: "Esc",
|
|
44
|
+
processing: "正在处理中...",
|
|
45
|
+
fullscreen: "全屏编辑",
|
|
46
|
+
syntax_selection: "--语法--",
|
|
47
|
+
close_tab: "关闭文件"
|
|
48
|
+
};
|
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
EditArea.prototype.focus = function() {
|
|
2
|
+
this.textarea.focus();
|
|
3
|
+
this.textareaFocused=true;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
EditArea.prototype.check_line_selection= function(timer_checkup){
|
|
8
|
+
var changes, infos, new_top, new_width,i;
|
|
9
|
+
|
|
10
|
+
var t1=t2=t2_1=t3=tLines=tend= new Date().getTime();
|
|
11
|
+
// l'editeur n'existe plus => on quitte
|
|
12
|
+
if(!editAreas[this.id])
|
|
13
|
+
return false;
|
|
14
|
+
|
|
15
|
+
if(!this.smooth_selection && !this.do_highlight)
|
|
16
|
+
{
|
|
17
|
+
//do nothing
|
|
18
|
+
}
|
|
19
|
+
else if(this.textareaFocused && editAreas[this.id]["displayed"]==true && this.isResizing==false)
|
|
20
|
+
{
|
|
21
|
+
infos = this.get_selection_infos();
|
|
22
|
+
changes = this.checkTextEvolution( typeof( this.last_selection['full_text'] ) == 'undefined' ? '' : this.last_selection['full_text'], infos['full_text'] );
|
|
23
|
+
|
|
24
|
+
t2= new Date().getTime();
|
|
25
|
+
|
|
26
|
+
// if selection change
|
|
27
|
+
if(this.last_selection["line_start"] != infos["line_start"] || this.last_selection["line_nb"] != infos["line_nb"] || infos["full_text"] != this.last_selection["full_text"] || this.reload_highlight || this.last_selection["selectionStart"] != infos["selectionStart"] || this.last_selection["selectionEnd"] != infos["selectionEnd"] || !timer_checkup )
|
|
28
|
+
{
|
|
29
|
+
// move and adjust text selection elements
|
|
30
|
+
new_top = this.getLinePosTop( infos["line_start"] );
|
|
31
|
+
new_width = Math.max(this.textarea.scrollWidth, this.container.clientWidth -50);
|
|
32
|
+
this.selection_field.style.top=this.selection_field_text.style.top=new_top+"px";
|
|
33
|
+
if(!this.settings['word_wrap']){
|
|
34
|
+
this.selection_field.style.width=this.selection_field_text.style.width=this.test_font_size.style.width=new_width+"px";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// usefull? => _$("cursor_pos").style.top=new_top+"px";
|
|
38
|
+
|
|
39
|
+
if(this.do_highlight==true)
|
|
40
|
+
{
|
|
41
|
+
// fill selection elements
|
|
42
|
+
var curr_text = infos["full_text"].split("\n");
|
|
43
|
+
var content = "";
|
|
44
|
+
//alert("length: "+curr_text.length+ " i: "+ Math.max(0,infos["line_start"]-1)+ " end: "+Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1)+ " line: "+infos["line_start"]+" [0]: "+curr_text[0]+" [1]: "+curr_text[1]);
|
|
45
|
+
var start = Math.max(0,infos["line_start"]-1);
|
|
46
|
+
var end = Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1);
|
|
47
|
+
|
|
48
|
+
//curr_text[start]= curr_text[start].substr(0,infos["curr_pos"]-1) +"¤_overline_¤"+ curr_text[start].substr(infos["curr_pos"]-1);
|
|
49
|
+
for(i=start; i< end; i++){
|
|
50
|
+
content+= curr_text[i]+"\n";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// add special chars arround selected characters
|
|
54
|
+
selLength = infos['selectionEnd'] - infos['selectionStart'];
|
|
55
|
+
content = content.substr( 0, infos["curr_pos"] - 1 ) + "\r\r" + content.substr( infos["curr_pos"] - 1, selLength ) + "\r\r" + content.substr( infos["curr_pos"] - 1 + selLength );
|
|
56
|
+
content = '<span>'+ content.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace("\r\r", '</span><strong>').replace("\r\r", '</strong><span>') +'</span>';
|
|
57
|
+
|
|
58
|
+
if( this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) {
|
|
59
|
+
this.selection_field.innerHTML= "<pre>" + content.replace(/^\r?\n/, "<br>") + "</pre>";
|
|
60
|
+
} else {
|
|
61
|
+
this.selection_field.innerHTML= content;
|
|
62
|
+
}
|
|
63
|
+
this.selection_field_text.innerHTML = this.selection_field.innerHTML;
|
|
64
|
+
t2_1 = new Date().getTime();
|
|
65
|
+
// check if we need to update the highlighted background
|
|
66
|
+
if(this.reload_highlight || (infos["full_text"] != this.last_text_to_highlight && (this.last_selection["line_start"]!=infos["line_start"] || this.show_line_colors || this.settings['word_wrap'] || this.last_selection["line_nb"]!=infos["line_nb"] || this.last_selection["nb_line"]!=infos["nb_line"]) ) )
|
|
67
|
+
{
|
|
68
|
+
this.maj_highlight(infos);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
t3= new Date().getTime();
|
|
73
|
+
|
|
74
|
+
// manage line heights
|
|
75
|
+
if( this.settings['word_wrap'] && infos["full_text"] != this.last_selection["full_text"])
|
|
76
|
+
{
|
|
77
|
+
// refresh only 1 line if text change concern only one line and that the total line number has not changed
|
|
78
|
+
if( changes.newText.split("\n").length == 1 && this.last_selection['nb_line'] && infos['nb_line'] == this.last_selection['nb_line'] )
|
|
79
|
+
{
|
|
80
|
+
this.fixLinesHeight( infos['full_text'], changes.lineStart, changes.lineStart );
|
|
81
|
+
}
|
|
82
|
+
else
|
|
83
|
+
{
|
|
84
|
+
this.fixLinesHeight( infos['full_text'], changes.lineStart, -1 );
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
tLines= new Date().getTime();
|
|
89
|
+
// manage bracket finding
|
|
90
|
+
if( infos["line_start"] != this.last_selection["line_start"] || infos["curr_pos"] != this.last_selection["curr_pos"] || infos["full_text"].length!=this.last_selection["full_text"].length || this.reload_highlight || !timer_checkup )
|
|
91
|
+
{
|
|
92
|
+
// move _cursor_pos
|
|
93
|
+
var selec_char= infos["curr_line"].charAt(infos["curr_pos"]-1);
|
|
94
|
+
var no_real_move=true;
|
|
95
|
+
if(infos["line_nb"]==1 && (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]) ){
|
|
96
|
+
|
|
97
|
+
no_real_move=false;
|
|
98
|
+
//findEndBracket(infos["line_start"], infos["curr_pos"], selec_char);
|
|
99
|
+
if(this.findEndBracket(infos, selec_char) === true){
|
|
100
|
+
_$("end_bracket").style.visibility ="visible";
|
|
101
|
+
_$("cursor_pos").style.visibility ="visible";
|
|
102
|
+
_$("cursor_pos").innerHTML = selec_char;
|
|
103
|
+
_$("end_bracket").innerHTML = (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]);
|
|
104
|
+
}else{
|
|
105
|
+
_$("end_bracket").style.visibility ="hidden";
|
|
106
|
+
_$("cursor_pos").style.visibility ="hidden";
|
|
107
|
+
}
|
|
108
|
+
}else{
|
|
109
|
+
_$("cursor_pos").style.visibility ="hidden";
|
|
110
|
+
_$("end_bracket").style.visibility ="hidden";
|
|
111
|
+
}
|
|
112
|
+
//alert("move cursor");
|
|
113
|
+
this.displayToCursorPosition("cursor_pos", infos["line_start"], infos["curr_pos"]-1, infos["curr_line"], no_real_move);
|
|
114
|
+
if(infos["line_nb"]==1 && infos["line_start"]!=this.last_selection["line_start"])
|
|
115
|
+
this.scroll_to_view();
|
|
116
|
+
}
|
|
117
|
+
this.last_selection=infos;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
tend= new Date().getTime();
|
|
121
|
+
//if( (tend-t1) > 7 )
|
|
122
|
+
// console.log( "tps total: "+ (tend-t1) + " tps get_infos: "+ (t2-t1)+ " tps selec: "+ (t2_1-t2)+ " tps highlight: "+ (t3-t2_1) +" tps lines: "+ (tLines-t3) +" tps cursor+lines: "+ (tend-tLines)+" \n" );
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
if(timer_checkup){
|
|
126
|
+
setTimeout("editArea.check_line_selection(true)", this.check_line_selection_timer);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
EditArea.prototype.get_selection_infos= function(){
|
|
132
|
+
var sel={}, start, end, len, str;
|
|
133
|
+
|
|
134
|
+
this.getIESelection();
|
|
135
|
+
start = this.textarea.selectionStart;
|
|
136
|
+
end = this.textarea.selectionEnd;
|
|
137
|
+
|
|
138
|
+
if( this.last_selection["selectionStart"] == start && this.last_selection["selectionEnd"] == end && this.last_selection["full_text"] == this.textarea.value )
|
|
139
|
+
{
|
|
140
|
+
return this.last_selection;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if(this.tabulation!="\t" && this.textarea.value.indexOf("\t")!=-1)
|
|
144
|
+
{ // can append only after copy/paste
|
|
145
|
+
len = this.textarea.value.length;
|
|
146
|
+
this.textarea.value = this.replace_tab(this.textarea.value);
|
|
147
|
+
start = end = start+(this.textarea.value.length-len);
|
|
148
|
+
this.area_select( start, 0 );
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
sel["selectionStart"] = start;
|
|
152
|
+
sel["selectionEnd"] = end;
|
|
153
|
+
sel["full_text"] = this.textarea.value;
|
|
154
|
+
sel["line_start"] = 1;
|
|
155
|
+
sel["line_nb"] = 1;
|
|
156
|
+
sel["curr_pos"] = 0;
|
|
157
|
+
sel["curr_line"] = "";
|
|
158
|
+
sel["indexOfCursor"] = 0;
|
|
159
|
+
sel["selec_direction"] = this.last_selection["selec_direction"];
|
|
160
|
+
|
|
161
|
+
//return sel;
|
|
162
|
+
var splitTab= sel["full_text"].split("\n");
|
|
163
|
+
var nbLine = Math.max(0, splitTab.length);
|
|
164
|
+
var nbChar = Math.max(0, sel["full_text"].length - (nbLine - 1)); // (remove \n caracters from the count)
|
|
165
|
+
if( sel["full_text"].indexOf("\r") != -1 )
|
|
166
|
+
nbChar = nbChar - ( nbLine - 1 ); // (remove \r caracters from the count)
|
|
167
|
+
sel["nb_line"] = nbLine;
|
|
168
|
+
sel["nb_char"] = nbChar;
|
|
169
|
+
|
|
170
|
+
if(start>0){
|
|
171
|
+
str = sel["full_text"].substr(0,start);
|
|
172
|
+
sel["curr_pos"] = start - str.lastIndexOf("\n");
|
|
173
|
+
sel["line_start"] = Math.max(1, str.split("\n").length);
|
|
174
|
+
}else{
|
|
175
|
+
sel["curr_pos"]=1;
|
|
176
|
+
}
|
|
177
|
+
if(end>start){
|
|
178
|
+
sel["line_nb"]=sel["full_text"].substring(start,end).split("\n").length;
|
|
179
|
+
}
|
|
180
|
+
sel["indexOfCursor"]=start;
|
|
181
|
+
sel["curr_line"]=splitTab[Math.max(0,sel["line_start"]-1)];
|
|
182
|
+
|
|
183
|
+
// determine in which direction the selection grow
|
|
184
|
+
if(sel["selectionStart"] == this.last_selection["selectionStart"]){
|
|
185
|
+
if(sel["selectionEnd"]>this.last_selection["selectionEnd"])
|
|
186
|
+
sel["selec_direction"]= "down";
|
|
187
|
+
else if(sel["selectionEnd"] == this.last_selection["selectionStart"])
|
|
188
|
+
sel["selec_direction"]= this.last_selection["selec_direction"];
|
|
189
|
+
}else if(sel["selectionStart"] == this.last_selection["selectionEnd"] && sel["selectionEnd"]>this.last_selection["selectionEnd"]){
|
|
190
|
+
sel["selec_direction"]= "down";
|
|
191
|
+
}else{
|
|
192
|
+
sel["selec_direction"]= "up";
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
_$("nbLine").innerHTML = nbLine;
|
|
196
|
+
_$("nbChar").innerHTML = nbChar;
|
|
197
|
+
_$("linePos").innerHTML = sel["line_start"];
|
|
198
|
+
_$("currPos").innerHTML = sel["curr_pos"];
|
|
199
|
+
|
|
200
|
+
return sel;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
// set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd)
|
|
204
|
+
EditArea.prototype.getIESelection= function(){
|
|
205
|
+
var selectionStart, selectionEnd, range, stored_range;
|
|
206
|
+
|
|
207
|
+
if( !this.isIE )
|
|
208
|
+
return false;
|
|
209
|
+
|
|
210
|
+
// make it work as nowrap mode (easier for range manipulation with lineHeight)
|
|
211
|
+
if( this.settings['word_wrap'] )
|
|
212
|
+
this.textarea.wrap='off';
|
|
213
|
+
|
|
214
|
+
try{
|
|
215
|
+
range = document.selection.createRange();
|
|
216
|
+
stored_range = range.duplicate();
|
|
217
|
+
stored_range.moveToElementText( this.textarea );
|
|
218
|
+
stored_range.setEndPoint( 'EndToEnd', range );
|
|
219
|
+
if( stored_range.parentElement() != this.textarea )
|
|
220
|
+
throw "invalid focus";
|
|
221
|
+
|
|
222
|
+
// the range don't take care of empty lines in the end of the selection
|
|
223
|
+
var scrollTop = this.result.scrollTop + document.body.scrollTop;
|
|
224
|
+
var relative_top= range.offsetTop - parent.calculeOffsetTop(this.textarea) + scrollTop;
|
|
225
|
+
var line_start = Math.round((relative_top / this.lineHeight) +1);
|
|
226
|
+
var line_nb = Math.round( range.boundingHeight / this.lineHeight );
|
|
227
|
+
|
|
228
|
+
selectionStart = stored_range.text.length - range.text.length;
|
|
229
|
+
selectionStart += ( line_start - this.textarea.value.substr(0, selectionStart).split("\n").length)*2; // count missing empty \r to the selection
|
|
230
|
+
selectionStart -= ( line_start - this.textarea.value.substr(0, selectionStart).split("\n").length ) * 2;
|
|
231
|
+
|
|
232
|
+
selectionEnd = selectionStart + range.text.length;
|
|
233
|
+
selectionEnd += (line_start + line_nb - 1 - this.textarea.value.substr(0, selectionEnd ).split("\n").length)*2;
|
|
234
|
+
|
|
235
|
+
this.textarea.selectionStart = selectionStart;
|
|
236
|
+
this.textarea.selectionEnd = selectionEnd;
|
|
237
|
+
}
|
|
238
|
+
catch(e){}
|
|
239
|
+
|
|
240
|
+
// restore wrap mode
|
|
241
|
+
if( this.settings['word_wrap'] )
|
|
242
|
+
this.textarea.wrap='soft';
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
// select the text for IE (and take care of \r caracters)
|
|
246
|
+
EditArea.prototype.setIESelection= function(){
|
|
247
|
+
var a = this.textarea, nbLineStart, nbLineEnd, range;
|
|
248
|
+
|
|
249
|
+
if( !this.isIE )
|
|
250
|
+
return false;
|
|
251
|
+
|
|
252
|
+
nbLineStart = a.value.substr(0, a.selectionStart).split("\n").length - 1;
|
|
253
|
+
nbLineEnd = a.value.substr(0, a.selectionEnd).split("\n").length - 1;
|
|
254
|
+
range = document.selection.createRange();
|
|
255
|
+
range.moveToElementText( a );
|
|
256
|
+
range.setEndPoint( 'EndToStart', range );
|
|
257
|
+
|
|
258
|
+
range.moveStart('character', a.selectionStart - nbLineStart);
|
|
259
|
+
range.moveEnd('character', a.selectionEnd - nbLineEnd - (a.selectionStart - nbLineStart) );
|
|
260
|
+
range.select();
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
EditArea.prototype.checkTextEvolution=function(lastText,newText){
|
|
266
|
+
// ch will contain changes datas
|
|
267
|
+
var ch={},baseStep=200, cpt=0, end, step,tStart=new Date().getTime();
|
|
268
|
+
|
|
269
|
+
end = Math.min(newText.length, lastText.length);
|
|
270
|
+
step = baseStep;
|
|
271
|
+
// find how many chars are similar at the begin of the text
|
|
272
|
+
while( cpt<end && step>=1 ){
|
|
273
|
+
if(lastText.substr(cpt, step) == newText.substr(cpt, step)){
|
|
274
|
+
cpt+= step;
|
|
275
|
+
}else{
|
|
276
|
+
step= Math.floor(step/2);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
ch.posStart = cpt;
|
|
281
|
+
ch.lineStart= newText.substr(0, ch.posStart).split("\n").length -1;
|
|
282
|
+
|
|
283
|
+
cpt_last = lastText.length;
|
|
284
|
+
cpt = newText.length;
|
|
285
|
+
step = baseStep;
|
|
286
|
+
// find how many chars are similar at the end of the text
|
|
287
|
+
while( cpt>=0 && cpt_last>=0 && step>=1 ){
|
|
288
|
+
if(lastText.substr(cpt_last-step, step) == newText.substr(cpt-step, step)){
|
|
289
|
+
cpt-= step;
|
|
290
|
+
cpt_last-= step;
|
|
291
|
+
}else{
|
|
292
|
+
step= Math.floor(step/2);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
ch.posNewEnd = cpt;
|
|
297
|
+
ch.posLastEnd = cpt_last;
|
|
298
|
+
if(ch.posNewEnd<=ch.posStart){
|
|
299
|
+
if(lastText.length < newText.length){
|
|
300
|
+
ch.posNewEnd= ch.posStart + newText.length - lastText.length;
|
|
301
|
+
ch.posLastEnd= ch.posStart;
|
|
302
|
+
}else{
|
|
303
|
+
ch.posLastEnd= ch.posStart + lastText.length - newText.length;
|
|
304
|
+
ch.posNewEnd= ch.posStart;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
ch.newText = newText.substring(ch.posStart, ch.posNewEnd);
|
|
308
|
+
ch.lastText = lastText.substring(ch.posStart, ch.posLastEnd);
|
|
309
|
+
|
|
310
|
+
ch.lineNewEnd = newText.substr(0, ch.posNewEnd).split("\n").length -1;
|
|
311
|
+
ch.lineLastEnd = lastText.substr(0, ch.posLastEnd).split("\n").length -1;
|
|
312
|
+
|
|
313
|
+
ch.newTextLine = newText.split("\n").slice(ch.lineStart, ch.lineNewEnd+1).join("\n");
|
|
314
|
+
ch.lastTextLine = lastText.split("\n").slice(ch.lineStart, ch.lineLastEnd+1).join("\n");
|
|
315
|
+
//console.log( ch );
|
|
316
|
+
return ch;
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
EditArea.prototype.tab_selection= function(){
|
|
320
|
+
if(this.is_tabbing)
|
|
321
|
+
return;
|
|
322
|
+
this.is_tabbing=true;
|
|
323
|
+
//infos=getSelectionInfos();
|
|
324
|
+
//if( document.selection ){
|
|
325
|
+
this.getIESelection();
|
|
326
|
+
/* Insertion du code de formatage */
|
|
327
|
+
var start = this.textarea.selectionStart;
|
|
328
|
+
var end = this.textarea.selectionEnd;
|
|
329
|
+
var insText = this.textarea.value.substring(start, end);
|
|
330
|
+
|
|
331
|
+
/* Insert tabulation and ajust cursor position */
|
|
332
|
+
var pos_start=start;
|
|
333
|
+
var pos_end=end;
|
|
334
|
+
if (insText.length == 0) {
|
|
335
|
+
// if only one line selected
|
|
336
|
+
this.textarea.value = this.textarea.value.substr(0, start) + this.tabulation + this.textarea.value.substr(end);
|
|
337
|
+
pos_start = start + this.tabulation.length;
|
|
338
|
+
pos_end=pos_start;
|
|
339
|
+
} else {
|
|
340
|
+
start= Math.max(0, this.textarea.value.substr(0, start).lastIndexOf("\n")+1);
|
|
341
|
+
endText=this.textarea.value.substr(end);
|
|
342
|
+
startText=this.textarea.value.substr(0, start);
|
|
343
|
+
tmp= this.textarea.value.substring(start, end).split("\n");
|
|
344
|
+
insText= this.tabulation+tmp.join("\n"+this.tabulation);
|
|
345
|
+
this.textarea.value = startText + insText + endText;
|
|
346
|
+
pos_start = start;
|
|
347
|
+
pos_end= this.textarea.value.indexOf("\n", startText.length + insText.length);
|
|
348
|
+
if(pos_end==-1)
|
|
349
|
+
pos_end=this.textarea.value.length;
|
|
350
|
+
//pos = start + repdeb.length + insText.length + ;
|
|
351
|
+
}
|
|
352
|
+
this.textarea.selectionStart = pos_start;
|
|
353
|
+
this.textarea.selectionEnd = pos_end;
|
|
354
|
+
|
|
355
|
+
//if( document.selection ){
|
|
356
|
+
if(this.isIE)
|
|
357
|
+
{
|
|
358
|
+
this.setIESelection();
|
|
359
|
+
setTimeout("editArea.is_tabbing=false;", 100); // IE can't accept to make 2 tabulation without a little break between both
|
|
360
|
+
}
|
|
361
|
+
else
|
|
362
|
+
{
|
|
363
|
+
this.is_tabbing=false;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
EditArea.prototype.invert_tab_selection= function(){
|
|
369
|
+
var t=this, a=this.textarea;
|
|
370
|
+
if(t.is_tabbing)
|
|
371
|
+
return;
|
|
372
|
+
t.is_tabbing=true;
|
|
373
|
+
//infos=getSelectionInfos();
|
|
374
|
+
//if( document.selection ){
|
|
375
|
+
t.getIESelection();
|
|
376
|
+
|
|
377
|
+
var start = a.selectionStart;
|
|
378
|
+
var end = a.selectionEnd;
|
|
379
|
+
var insText = a.value.substring(start, end);
|
|
380
|
+
|
|
381
|
+
/* Tab remove and cursor seleciton adjust */
|
|
382
|
+
var pos_start=start;
|
|
383
|
+
var pos_end=end;
|
|
384
|
+
if (insText.length == 0) {
|
|
385
|
+
if(a.value.substring(start-t.tabulation.length, start)==t.tabulation)
|
|
386
|
+
{
|
|
387
|
+
a.value = a.value.substr(0, start-t.tabulation.length) + a.value.substr(end);
|
|
388
|
+
pos_start = Math.max(0, start-t.tabulation.length);
|
|
389
|
+
pos_end = pos_start;
|
|
390
|
+
}
|
|
391
|
+
/*
|
|
392
|
+
a.value = a.value.substr(0, start) + t.tabulation + insText + a.value.substr(end);
|
|
393
|
+
pos_start = start + t.tabulation.length;
|
|
394
|
+
pos_end=pos_start;*/
|
|
395
|
+
} else {
|
|
396
|
+
start = a.value.substr(0, start).lastIndexOf("\n")+1;
|
|
397
|
+
endText = a.value.substr(end);
|
|
398
|
+
startText = a.value.substr(0, start);
|
|
399
|
+
tmp = a.value.substring(start, end).split("\n");
|
|
400
|
+
insText = "";
|
|
401
|
+
for(i=0; i<tmp.length; i++){
|
|
402
|
+
for(j=0; j<t.tab_nb_char; j++){
|
|
403
|
+
if(tmp[i].charAt(0)=="\t"){
|
|
404
|
+
tmp[i]=tmp[i].substr(1);
|
|
405
|
+
j=t.tab_nb_char;
|
|
406
|
+
}else if(tmp[i].charAt(0)==" ")
|
|
407
|
+
tmp[i]=tmp[i].substr(1);
|
|
408
|
+
}
|
|
409
|
+
insText+=tmp[i];
|
|
410
|
+
if(i<tmp.length-1)
|
|
411
|
+
insText+="\n";
|
|
412
|
+
}
|
|
413
|
+
//insText+="_";
|
|
414
|
+
a.value = startText + insText + endText;
|
|
415
|
+
pos_start = start;
|
|
416
|
+
pos_end = a.value.indexOf("\n", startText.length + insText.length);
|
|
417
|
+
if(pos_end==-1)
|
|
418
|
+
pos_end=a.value.length;
|
|
419
|
+
//pos = start + repdeb.length + insText.length + ;
|
|
420
|
+
}
|
|
421
|
+
a.selectionStart = pos_start;
|
|
422
|
+
a.selectionEnd = pos_end;
|
|
423
|
+
|
|
424
|
+
//if( document.selection ){
|
|
425
|
+
if(t.isIE){
|
|
426
|
+
// select the text for IE
|
|
427
|
+
t.setIESelection();
|
|
428
|
+
setTimeout("editArea.is_tabbing=false;", 100); // IE can accept to make 2 tabulation without a little break between both
|
|
429
|
+
}else
|
|
430
|
+
t.is_tabbing=false;
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
EditArea.prototype.press_enter= function(){
|
|
434
|
+
if(!this.smooth_selection)
|
|
435
|
+
return false;
|
|
436
|
+
this.getIESelection();
|
|
437
|
+
var scrollTop= this.result.scrollTop;
|
|
438
|
+
var scrollLeft= this.result.scrollLeft;
|
|
439
|
+
var start=this.textarea.selectionStart;
|
|
440
|
+
var end= this.textarea.selectionEnd;
|
|
441
|
+
var start_last_line= Math.max(0 , this.textarea.value.substring(0, start).lastIndexOf("\n") + 1 );
|
|
442
|
+
var begin_line= this.textarea.value.substring(start_last_line, start).replace(/^([ \t]*).*/gm, "$1");
|
|
443
|
+
var lineStart = this.textarea.value.substring(0, start).split("\n").length;
|
|
444
|
+
if(begin_line=="\n" || begin_line=="\r" || begin_line.length==0)
|
|
445
|
+
{
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if(this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ){
|
|
450
|
+
begin_line="\r\n"+ begin_line;
|
|
451
|
+
}else{
|
|
452
|
+
begin_line="\n"+ begin_line;
|
|
453
|
+
}
|
|
454
|
+
//alert(start_last_line+" strat: "+start +"\n"+this.textarea.value.substring(start_last_line, start)+"\n_"+begin_line+"_")
|
|
455
|
+
this.textarea.value= this.textarea.value.substring(0, start) + begin_line + this.textarea.value.substring(end);
|
|
456
|
+
|
|
457
|
+
this.area_select(start+ begin_line.length ,0);
|
|
458
|
+
// during this process IE scroll back to the top of the textarea
|
|
459
|
+
if(this.isIE){
|
|
460
|
+
this.result.scrollTop = scrollTop;
|
|
461
|
+
this.result.scrollLeft = scrollLeft;
|
|
462
|
+
}
|
|
463
|
+
return true;
|
|
464
|
+
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
EditArea.prototype.findEndBracket= function(infos, bracket){
|
|
468
|
+
|
|
469
|
+
var start=infos["indexOfCursor"];
|
|
470
|
+
var normal_order=true;
|
|
471
|
+
//curr_text=infos["full_text"].split("\n");
|
|
472
|
+
if(this.assocBracket[bracket])
|
|
473
|
+
endBracket=this.assocBracket[bracket];
|
|
474
|
+
else if(this.revertAssocBracket[bracket]){
|
|
475
|
+
endBracket=this.revertAssocBracket[bracket];
|
|
476
|
+
normal_order=false;
|
|
477
|
+
}
|
|
478
|
+
var end=-1;
|
|
479
|
+
var nbBracketOpen=0;
|
|
480
|
+
|
|
481
|
+
for(var i=start; i<infos["full_text"].length && i>=0; ){
|
|
482
|
+
if(infos["full_text"].charAt(i)==endBracket){
|
|
483
|
+
nbBracketOpen--;
|
|
484
|
+
if(nbBracketOpen<=0){
|
|
485
|
+
//i=infos["full_text"].length;
|
|
486
|
+
end=i;
|
|
487
|
+
break;
|
|
488
|
+
}
|
|
489
|
+
}else if(infos["full_text"].charAt(i)==bracket)
|
|
490
|
+
nbBracketOpen++;
|
|
491
|
+
if(normal_order)
|
|
492
|
+
i++;
|
|
493
|
+
else
|
|
494
|
+
i--;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
//end=infos["full_text"].indexOf("}", start);
|
|
498
|
+
if(end==-1)
|
|
499
|
+
return false;
|
|
500
|
+
var endLastLine=infos["full_text"].substr(0, end).lastIndexOf("\n");
|
|
501
|
+
if(endLastLine==-1)
|
|
502
|
+
line=1;
|
|
503
|
+
else
|
|
504
|
+
line= infos["full_text"].substr(0, endLastLine).split("\n").length + 1;
|
|
505
|
+
|
|
506
|
+
var curPos= end - endLastLine - 1;
|
|
507
|
+
var endLineLength = infos["full_text"].substring(end).split("\n")[0].length;
|
|
508
|
+
this.displayToCursorPosition("end_bracket", line, curPos, infos["full_text"].substring(endLastLine +1, end + endLineLength));
|
|
509
|
+
return true;
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
EditArea.prototype.displayToCursorPosition= function(id, start_line, cur_pos, lineContent, no_real_move){
|
|
513
|
+
var elem,dest,content,posLeft=0,posTop,fixPadding,topOffset,endElem;
|
|
514
|
+
|
|
515
|
+
elem = this.test_font_size;
|
|
516
|
+
dest = _$(id);
|
|
517
|
+
content = "<span id='test_font_size_inner'>"+lineContent.substr(0, cur_pos).replace(/&/g,"&").replace(/</g,"<")+"</span><span id='endTestFont'>"+lineContent.substr(cur_pos).replace(/&/g,"&").replace(/</g,"<")+"</span>";
|
|
518
|
+
if( this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) {
|
|
519
|
+
elem.innerHTML= "<pre>" + content.replace(/^\r?\n/, "<br>") + "</pre>";
|
|
520
|
+
} else {
|
|
521
|
+
elem.innerHTML= content;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
endElem = _$('endTestFont');
|
|
526
|
+
topOffset = endElem.offsetTop;
|
|
527
|
+
fixPadding = parseInt( this.content_highlight.style.paddingLeft.replace("px", "") );
|
|
528
|
+
posLeft = 45 + endElem.offsetLeft + ( !isNaN( fixPadding ) && topOffset > 0 ? fixPadding : 0 );
|
|
529
|
+
posTop = this.getLinePosTop( start_line ) + topOffset;// + Math.floor( ( endElem.offsetHeight - 1 ) / this.lineHeight ) * this.lineHeight;
|
|
530
|
+
|
|
531
|
+
// detect the case where the span start on a line but has no display on it
|
|
532
|
+
if( this.isIE && cur_pos > 0 && endElem.offsetLeft == 0 )
|
|
533
|
+
{
|
|
534
|
+
posTop += this.lineHeight;
|
|
535
|
+
}
|
|
536
|
+
if(no_real_move!=true){ // when the cursor is hidden no need to move him
|
|
537
|
+
dest.style.top=posTop+"px";
|
|
538
|
+
dest.style.left=posLeft+"px";
|
|
539
|
+
}
|
|
540
|
+
// usefull for smarter scroll
|
|
541
|
+
dest.cursor_top=posTop;
|
|
542
|
+
dest.cursor_left=posLeft;
|
|
543
|
+
// _$(id).style.marginLeft=posLeft+"px";
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
EditArea.prototype.getLinePosTop= function(start_line){
|
|
547
|
+
var elem= _$('line_'+ start_line), posTop=0;
|
|
548
|
+
if( elem )
|
|
549
|
+
posTop = elem.offsetTop;
|
|
550
|
+
else
|
|
551
|
+
posTop = this.lineHeight * (start_line-1);
|
|
552
|
+
return posTop;
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
// return the dislpayed height of a text (take word-wrap into account)
|
|
557
|
+
EditArea.prototype.getTextHeight= function(text){
|
|
558
|
+
var t=this,elem,height;
|
|
559
|
+
elem = t.test_font_size;
|
|
560
|
+
content = text.replace(/&/g,"&").replace(/</g,"<");
|
|
561
|
+
if( t.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) {
|
|
562
|
+
elem.innerHTML= "<pre>" + content.replace(/^\r?\n/, "<br>") + "</pre>";
|
|
563
|
+
} else {
|
|
564
|
+
elem.innerHTML= content;
|
|
565
|
+
}
|
|
566
|
+
height = elem.offsetHeight;
|
|
567
|
+
height = Math.max( 1, Math.floor( elem.offsetHeight / this.lineHeight ) ) * this.lineHeight;
|
|
568
|
+
return height;
|
|
569
|
+
};
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Fix line height for the given lines
|
|
573
|
+
* @param Integer linestart
|
|
574
|
+
* @param Integer lineEnd End line or -1 to cover all lines
|
|
575
|
+
*/
|
|
576
|
+
EditArea.prototype.fixLinesHeight= function( textValue, lineStart,lineEnd ){
|
|
577
|
+
var aText = textValue.split("\n");
|
|
578
|
+
if( lineEnd == -1 )
|
|
579
|
+
lineEnd = aText.length-1;
|
|
580
|
+
for( var i = Math.max(0, lineStart); i <= lineEnd; i++ )
|
|
581
|
+
{
|
|
582
|
+
if( elem = _$('line_'+ ( i+1 ) ) )
|
|
583
|
+
{
|
|
584
|
+
elem.style.height= typeof( aText[i] ) != "undefined" ? this.getTextHeight( aText[i] )+"px" : this.lineHeight;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
EditArea.prototype.area_select= function(start, length){
|
|
590
|
+
this.textarea.focus();
|
|
591
|
+
|
|
592
|
+
start = Math.max(0, Math.min(this.textarea.value.length, start));
|
|
593
|
+
end = Math.max(start, Math.min(this.textarea.value.length, start+length));
|
|
594
|
+
|
|
595
|
+
if(this.isIE)
|
|
596
|
+
{
|
|
597
|
+
this.textarea.selectionStart = start;
|
|
598
|
+
this.textarea.selectionEnd = end;
|
|
599
|
+
this.setIESelection();
|
|
600
|
+
}
|
|
601
|
+
else
|
|
602
|
+
{
|
|
603
|
+
// Opera bug when moving selection start and selection end
|
|
604
|
+
if(this.isOpera && this.isOpera < 9.6 )
|
|
605
|
+
{
|
|
606
|
+
this.textarea.setSelectionRange(0, 0);
|
|
607
|
+
}
|
|
608
|
+
this.textarea.setSelectionRange(start, end);
|
|
609
|
+
}
|
|
610
|
+
this.check_line_selection();
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
EditArea.prototype.area_get_selection= function(){
|
|
615
|
+
var text="";
|
|
616
|
+
if( document.selection ){
|
|
617
|
+
var range = document.selection.createRange();
|
|
618
|
+
text=range.text;
|
|
619
|
+
}else{
|
|
620
|
+
text= this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd);
|
|
621
|
+
}
|
|
622
|
+
return text;
|
|
623
|
+
};
|