Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 19.01.2013, 13:50
Новичок на форуме
Отправить личное сообщение для BravoTwo Посмотреть профиль Найти все сообщения от BravoTwo
 
Регистрация: 28.08.2012
Сообщений: 9

danik.js, спасибо за ссылку! пригодится для изучения, но хотелось бы свой велосипед состряпать (а главное понять как он работает) в целях набивания опыта. Тема интересная и для меня сложная достаточно, так что это уже дело принципа
Ответить с цитированием
  #12 (permalink)  
Старый 19.01.2013, 16:32
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Если вкратце, то редактор состоит из следующих составляющих:
1) Элемент ввода-вывода текста. Как правило это невидимая textarea, которой и принадлежит фокус ввода, и которая подставляется под мышку при правом клике. Все изменения содержимого отлавливаются редактором и отражаются в области отображения кода. Впринципе, вместо текстарии можно использовать div.contenteditable для всего редактора и либо ставить курсор в невидимый элемент и эмулировать его через какойнибудь span, либо оставить реальным. Однако тут будут проблемы с firefox, так как он не позволяет отлавливать копирование/вставку текста. Плюс много других проблем.

2) Область отображения текста. Тут все довольно просто, если не нужно особой производительности. Имеем кучу div-ов - каждый div представляет собой строку. В нем уже идут span-ы, представляющие собой токены. Все изменения содержимого редактора отражаются тут. Для больших документов используется хитрый трюк - создаются div-ы только для видимых в данный момент элементов, а при прокрутке они меняются, создается впечатление прокрутки. При этом скроллбар выносится в отдельный элемент. Прокрутка колесом мыши полностью управляется редактором.

3) область подсветки выделенного текста, и других выделений. Тоесть тут отображаем фэйковое выделение.

Внутри же редактор это обычно:
Selection - отвечает за выделение
Tokenizer - обычно работает в отдельном потоке как webworker, чтоб не тормозить UI. Берет набор правил ввиде массива состояний и регулярок. Запоминает начальные состяния каждой строки, чтоб при изменении пере-размечать текст начиная с измененной линии, а не с начала. Должен уметь прерываться, чтоб при частом изменении документа не выполнять лишнюю работу.
UndoManager - запоминает изменения. В хорошей реализации держит в памяти только дельты, то-есть разницы, а не целиком тексты
CommandManager - набор команд и управление ими. Часто даже элементарные действия как перемещение курсора стрелкой также хранятся и управляются тут же.


Как я помню, CodeMirror изначально работал на iframe+designMode, имел натуральный курсор и выделение. (прошлый век)
Потом стал использоваться contenteditable. (много проблем, особенно из-за FireFox)
Затем если не ошибаюсь - textarea для ввода + имитация выделения и курсора. (самый эффективный способ, хотя и тут есть куча недостатков)

Я не рекомендую CodeMirror для изучения, хотя он проще чем Ace.
Дело в том что в нем все свалено в одну кучу, в один файл. Код не особо читабелен. Разработчик одно время считал что это улучшает производительность (я про один файл, а не читабельность)
В Ace все сделано очень грамотно и красиво (местами не очень), рекомендую для изучения исходников. Хотя реализация достаточно сложная (в угоду производительности и функциональности)

Кстати, ща работаю над расширением для Chrome, которое позволит заменять на сайтах текстарии редактором (Ace). Например на этом сайте будет удобно писать куски кода на javascript. Можно сказать, будет встроенный Sublime Text в браузер, причем на любом желаемом сайте.
Ответить с цитированием
  #13 (permalink)  
Старый 19.01.2013, 18:03
Новичок на форуме
Отправить личное сообщение для german70 Посмотреть профиль Найти все сообщения от german70
 
Регистрация: 09.01.2013
Сообщений: 8

Занимаюсь примерно тем же. Проблемы с курсором решил так. В Опере цвет текста в textarea делаю transparent т.е прозрачный . Текст не виден зато курсор маячит. А хроме и фире opacity:0.3; Правда надо с позиционировать текст в textarea и div так чтоб полупрозрачный текст не был виден.
p.s У меня проблемы с выводом номера строки.Может есть какие решения?
Ответить с цитированием
  #14 (permalink)  
Старый 19.01.2013, 18:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кажется в EditArea используется подобный подход - отображается прозрачная textarea + подсветка другим слоем. Для небольших документов такой подход сгодится.
Может окажется полезным: http://en.wikipedia.org/wiki/Compari...e_code_editors
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой способ подсветки синтаксиса textarea (начинающим) Paguo-86PK Events/DOM/Window 1 17.12.2013 21:05
Подсветка синткасиса в textarea. Chrome. kadabrik Opera, Safari и др. 3 31.08.2011 12:38
Подсветка синтаксиса. hacker_007 Общие вопросы Javascript 1 07.02.2011 14:57
Resize textarea, в копилку. Robox jQuery 0 17.01.2011 18:05
Подсветка HTML внутри TEXTAREA inetusr Общие вопросы Javascript 2 24.02.2009 17:22