Самодельный HTML-редактор
Я прекрасно понимаю, что сказанное ниже способно вызвать у профессионального программиста лишь ироническую улыбку. Однако это хорошо демонстрирует весь спектр возможностей редактора Nedit, который могут настроить под конкретную задачу даже люди с невысоким уровнем подготовки.
Итак, перед нами стоит задача составления достаточно длинных и относительно структурированных документов, предназначенных в первую очередь для размещения в Сети. При этом не исключается возможность, что они в дальнейшем будут воплощены и на бумаге в виде журнальных или книжных публикаций (для чего может потребоваться импорт документа в текстовый процессор или программу верстки). Способов комфортного выполнения этой работы несколько. Что в таком случае можно делать?
- Набирать текст в текстовом процессоре (таком как StarWriter из комплекта StarOffice) с дальнейшим экспортом в формат HTML - качество HTML-кода при этом получается настолько низкое, что пользоваться этим методом для серьезной работы нельзя.
- Набирать текст в визуальном редакторе Web-страниц типа Netscape Composer; однако к HTML-коду невысокого качества здесь добавляются очень скромные возможности форматирования и контроля за HTML-кодом.
- Набирать текст в любом подходящем по возможностям HTML-редакторе с одновременной расстановкой требуемых тегов его штатными средствами; однако далеко не всегда такие редакторы столь универсальны, как нам требуется; к тому же оба известных мне полнофункциональных HTML-редактора под Linux (WebMaker и Quanta) обладают общим недостатком: они позволяют набирать текст либо в одну строку (что неудобно визуально), либо с переносом слов через фиксированное количество знаков с образованием символа возврата каретки (что совершенно ни к чему при импорте в текстовый процессор).
- Набирать текст в обычном текстовом редакторе с последующим помещением в редактор HTML-кода, где и осуществляется его (текста) разметка; но, помимо сложностей с двухэтапным созданием документа, такой метод приводит к появлению двух содержательно идентичных (по идее) файлов, а какой из них более актуален - удается вспомнить не всегда.
Поэтому оптимальным представляется составление документа в текстовом редакторе с одновременной разметкой тегами HTML. Однако проставлять теги вручную, даже если помнишь все наизусть, - занятие малопроизводительное. Посему возникает естественное желание эту процедуру автоматизировать, благо NEdit с его развитым макроязыком и простыми средствами применения последнего такую возможность обеспечивает.
Для начала определимся, какие теги требуются для каждодневного использования. Это: 1) заголовки нескольких уровней - <h1></h1>, <h2></h2> и т.д.; 2) теги начала абзаца (<p>) и разрыва строки (<br>); 3) структурные теги: emphasis (<em></em>) и preformatted text (pre и /pre); 4) всякого рода списки - маркированные (<ul></ul>), нумерованные (<ol></ol>), списки с определениями и их элементы (<dl></dl>, <li>, <dt>, <dd>); 5) гиперссылки (<a href=""></a>) и именованные якоря (<a name=""></a>).
Вот в такой последовательности и будем создавать соответствующие макросы. Включаем режим протоколирования (через меню Macro - Learn Keystrokes или комбинацией клавиш Alt+K) и просто-напросто набираем с клавиатуры последовательность символов.
Для обеспечения непрерывности набора логично вернуть курсор в позицию между открывающим и закрывающим тегами, для чего соответствующее количество раз нажимаем клавишу Left. После чего завершаем протоколирование (через меню Macro - Finish Learn или повторным нажатием Alt+K), при помощи меню Macro Replay Keystrokes (или комбинации Ctrl+K) проверяем правильность исполнения и переходим в меню Preferences - Default Settings - Customize Menu - Macro Menu. В появившейся панели Macro Commands (см. рис. 2) указываем в поле Menu Entry:
Headers>header1
В поле Accelerator приписываем команде клавишу вызова (например, F1, благо она не закреплена за вызовом справки), при желании определяем мнемоническую литеру и нажимаем экранную кнопку Paste Learn/Reply Macro. В результате в поле Macro Command to Execute появляется примерно такой код:
insert_string("<") insert_string("h") insert_string("1") insert_string(">") insert_string("<") insert_string("/") insert_string("h") insert_string("1") insert_string(">") backward_character() backward_character() backward_character() backward_character() backward_character()
Поскольку правильность макрокоманды мы уже проверили, нажимаем Apply для ее включения в список и переходим к следующему пункту нашей программы. Конечно, можно повторить протоколирование набора для тегов заголовков всех уровней последовательно. Но проще с помощью экранной клавиши Copy скопировать только что созданный макрос, изменить в поле Menu Entry его название с header1 на header2, закрепить за ним клавишу F2 и в поле Paste Learn/Reply Macro отредактировать код вручную, заменив строку
insert_string("1")
на
insert_string("2").
Подобную процедуру придется повторить для заголовков всех требуемых уровней (хотя вряд ли их число превысит четыре).
Затем переходим к созданию макросов для наиболее часто требующихся при наборе тегов абзаца и разрыва строки. Порядок действий идентичный: протоколирование ввода тега, вызов панели Macro Commands, описание имени команды (с учетом ее положения в иерархическом меню), закрепление за ней свободной комбинации "горячих" клавиш, помещение "заученного" кода макроса в поле команд для исполнения, включение новой макрокоманды в список доступных. И так для всех тегов, которые, как нам представляется, требуются постоянно и ежедневно...
Завершив создание макросов, следует не забыть сохранить их в меню с помощью Preferences - Save Defaults. После чего они будут доступны в последующих сеансах NEdit, поскольку размещаются в файле .nedit. в секции
nedit.macroCommands:
На сайте http://linuxsaga.newmail.ru/ приведено содержимое этой секции после того, как я разработал серию макросов для своих личных целей. Не судите строго: с точки зрения программиста-профессионала ничего замечательного там не содержится. Но а) этот процесс занял у меня считанные минуты, и б) результатов его мне вполне хватает в 90 случаях из 100.
Чего еще хотелось бы от несложного HTML-редактора? Ну конечно, визуализации производимых изменений в каком-либо внешнем браузере (каковым, с большой долей вероятности, будет Netscape Navigator текущей версии).
Для этого мы прибегнем к настройке меню Shell (Preferences - Default Settings - Customize Menu - Shell Menu). В соответствующей панели (см. рис. 3) определяем, как описано выше, поле имени команды. Если есть желание просматривать плоды своих трудов в разных браузерах, можно создать иерархическое меню, например:
Browser>netscape Browser>lynx Browser>opera
оставляя, скорее всего, пустыми поля Accelerator и Mnemonic (не столь это частая процедура - вызов внешнего браузера, чтобы тратить на нее драгоценную клавишную комбинацию, коих и так не в избытке).
А затем вводим в поле Shell Command to Execute строку
konsole -e netscape %
или иную любимую терминальную программу в качестве первого элемента (xterm. rxvt, etc.). И ни в коем случае не забываем параметр %, предписывающий браузеру отображать именно редактируемый в NEdit файл.
Теперь разбираемся с переключателями. В линейке Command Input логично отметить значение None (иначе есть риск получить по закрытии Netscape пустой файл), в линейке Command Output - значение same window. Кроме того, не худо бы включить также опцию сохранения текущего файла перед выполнением команды (Save file before executing command).
Принимаем изменения (экранной клавишей Apply) и проверяем действие команды. Если все нормально, выбор из меню Shell пункта netscape должен вызвать появление сначала терминального окна, а затем - окна браузера Netscape Navigator, отображающего редактируемый файл в текущем его состоянии. Если да - сохраняем ситуацию (через меню Preferences - Save Defaults), и собственный HTML-редактор готов!
Как и результат редактирования меню макрокоманд, результаты действий по встраиванию команд оболочки попадают в файл .nedit, в секцию
nedit.shellCommands:
где их можно в дальнейшем редактировать непосредственно.
Эта статья написана не только к вящей славе редактора NEdit. Автор руководствовался и собственными корыстными соображениями: вдруг кто-нибудь напишет достаточное количество качественных наборов макросов для NEdit на все случаи жизни?