Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Юзич Зрелый участник форума
Зарегистрирован: 07.02.2006 Сообщения: 120 Откуда: Республика Беларусь
|
Добавлено: Вт Мар 28, 2006 20:54 Заголовок сообщения: FB Editor - скрипты, вопросы... |
|
|
Недавно пытался делать скрипты для FB Editor.
Вот что у меня получилось:
Этот скрипт вставляет в документ текущую дату.
Код: | function FBEScriptName() {
return "FBE Insert Current Date Script";
}
function FBEGetFlags() {
return 1;
}
function Run(body,desc) {
var mm = new Date();
body.Document.selection.createRange().pasteHTML(mm.getYear()+"."+mm.getMonth()+"."+mm.getDate());
}
|
А этот - конвертирует в выделенном фрагменте сточные буквы в заглавные.
Код: | function FBEScriptName() {
return "FBE Text To UpperCase Script";
}
function FBEGetFlags() {
return 1;
}
function Run(body,cp) {
body.document.selection.createRange().pasteHTML(body.document.selection.createRange().text.toUpperCase());
|
Побочные эффекты - пропадает выделение полужирным шрифтом, курсив, линки, и т.д.
Если выделено больше одного абзаца, то все сливается в один абзац.
Вопрос на засыпку: как грамотно обратиться к выделенному фрагменту документа?
И есть ли нормальный справочник по функциям JavaScript (не руководство для WEB-кодеров), пользуясь которым, можно делать скрипты для FBE?
Вообще, такое впечатление, что JavaScript в FBE какой-то урезанный.
Напоследок. Как работает команда Words в меню Tools? Или она не закончена? |
|
Вернуться к началу |
|
|
vvv Автор редактора BookDesigner
Зарегистрирован: 06.10.2004 Сообщения: 349
|
Добавлено: Вт Мар 28, 2006 21:47 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
Юзич писал(а): | Вопрос на засыпку: как грамотно обратиться к выделенному фрагменту документа?
|
body.document.selection.createRange().text.toUpperCase убивает тэги в выделенном фрагменте.
Функцию Run надо аккуратнее сделать, с сохранением существующих в фрагменте тэгов. Т.е. брать html фрагмента, конвертировать в UpperCase только текст (не трогая тэги), а потом вставлять новый html, а не текст. |
|
Вернуться к началу |
|
|
Юзич Зрелый участник форума
Зарегистрирован: 07.02.2006 Сообщения: 120 Откуда: Республика Беларусь
|
Добавлено: Ср Мар 29, 2006 19:15 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
vvv писал(а): |
Функцию Run надо аккуратнее сделать, с сохранением существующих в фрагменте тэгов. Т.е. брать html фрагмента, конвертировать в UpperCase только текст (не трогая тэги), а потом вставлять новый html, а не текст. |
Потрясающе! Вы сообщили мне то, что я и сам прекрасно знаю.
Теперь, если кто-нибудь скажет, как
vvv писал(а): | брать html фрагмента, ... а потом вставлять новый html, а не текст. | или посоветует справочник с примерами, будет совсем хорошо... |
|
Вернуться к началу |
|
|
vvv Автор редактора BookDesigner
Зарегистрирован: 06.10.2004 Сообщения: 349
|
Добавлено: Ср Мар 29, 2006 19:41 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
Юзич писал(а): |
Теперь, если кто-нибудь скажет, как
vvv писал(а): | брать html фрагмента, ... а потом вставлять новый html, а не текст. | |
Взять: через outerHTML или innerHTML
Вставить: через pasteHTML
Примеры и детали - смотреть здесь:
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/dhtml_reference_entry.asp
P.S. Для сложных фрагментов рекомендуется пользовать метод insertAdjacentHTML вместо pasteHTML. Во избежании появления несанкционированных тэгов. |
|
Вернуться к началу |
|
|
GribUser Автор формата FB2 - Автор библиотеки FB
Зарегистрирован: 30.09.2004 Сообщения: 2475 Откуда: Москва
|
Добавлено: Ср Мар 29, 2006 23:11 Заголовок сообщения: |
|
|
А еще лучше работать по возможности не с html, а с dom-деревом, в данном случае это в высшей мере оправдано.
А справочник вам нужен именно для веб-кодера. Просто нужен хороший справочник по DOM. Я хожу частенько на
http://www.w3schools.com/js/
но и на сайте M$ очень прилично описано, в данном случае даже M$ предпочтительнее, ибо там MSHTML юзается. |
|
Вернуться к началу |
|
|
Юзич Зрелый участник форума
Зарегистрирован: 07.02.2006 Сообщения: 120 Откуда: Республика Беларусь
|
Добавлено: Вт Апр 04, 2006 21:04 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
vvv писал(а): | Юзич писал(а): |
Теперь, если кто-нибудь скажет, как
vvv писал(а): | брать html фрагмента, ... а потом вставлять новый html, а не текст. | |
Взять: через outerHTML или innerHTML
Вставить: через pasteHTML |
Не стыкуется с body.document.selection.createRange().
Вот за ссылку - большое спасибо. Великолепный справочник.
Если бы еще найти что-то подобное в офлайновом виде...
vvv писал(а): |
P.S. Для сложных фрагментов рекомендуется пользовать метод insertAdjacentHTML вместо pasteHTML. Во избежании появления несанкционированных тэгов. |
Тоже не стыкуется с body.document.selection.createRange().
Добавлено спустя 6 минут 13 секунд:
GribUser писал(а): | А еще лучше работать по возможности не с html, а с dom-деревом, в данном случае это в высшей мере оправдано.
А справочник вам нужен именно для веб-кодера. Просто нужен хороший справочник по DOM. Я хожу частенько на
http://www.w3schools.com/js/
но и на сайте M$ очень прилично описано, в данном случае даже M$ предпочтительнее, ибо там MSHTML юзается. |
Тоже большое спасибо. Полезная ссылка.
И все-таки... Как работает команда Words в меню Tools? |
|
Вернуться к началу |
|
|
LX Главный экзекутор
Зарегистрирован: 05.12.2004 Сообщения: 967 Откуда: Минск
|
Добавлено: Ср Апр 05, 2006 18:45 Заголовок сообщения: |
|
|
Юзич писал(а): | Если бы еще найти что-то подобное в офлайновом виде... |
MSDN есть в трехкомпактовом виде, могу поделиться. судя по твоей инфе, ты белорус -- так что если у тебя есть возможность встретиться в минске, кинь мне мессагу в приват _________________ disinformation must be free! |
|
Вернуться к началу |
|
|
vvv Автор редактора BookDesigner
Зарегистрирован: 06.10.2004 Сообщения: 349
|
Добавлено: Ср Апр 05, 2006 23:35 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
Юзич писал(а): |
Не стыкуется с body.document.selection.createRange().
|
Попробуйте что-нибудь типа
var rng=body.document.selection.createRange()
var htm=rng.htmlText
P.S. Тэги в htmlText могут не всегда соответствовать ожидаемым. По той причине, что MSHTML извлекает содержимое Range как валидный (с точки зрения MSHTML) фрагмент. Поэтому порой может добавить туда неожиданные тэги. |
|
Вернуться к началу |
|
|
GribUser Автор формата FB2 - Автор библиотеки FB
Зарегистрирован: 30.09.2004 Сообщения: 2475 Откуда: Москва
|
Добавлено: Чт Апр 06, 2006 10:52 Заголовок сообщения: |
|
|
vvv писал(а): | Поэтому порой может добавить туда неожиданные тэги. | Я потому и говорю, что работать лучше с DOM-деревом, там все предсказуемо в случае с FBE - 100% валидный xhtml. При работе с обычным html в вебе я тоже стараюсь добраться до innerHTML, так как там могут быть глюки типа element.child.parent != element и т.п. Но с FBE такого можно не опасаться. |
|
Вернуться к началу |
|
|
vvv Автор редактора BookDesigner
Зарегистрирован: 06.10.2004 Сообщения: 349
|
Добавлено: Пт Апр 07, 2006 1:41 Заголовок сообщения: |
|
|
GribUser писал(а): | Я потому и говорю, что работать лучше с DOM-деревом |
Конечно, лучше. И даже более того, работа с деревом - это единственный способ получения приличного html из IE.
BD и FBD именно так и работают. Но помню, сколько мне трудов стоило приручение IE на предмет корректного интерактивного редактирования. Так, чтобы пересекающиеся и вложенные тэги расщеплялись...
А Юзич, судя по всему, человек в этом деле новый, так что не знаю... |
|
Вернуться к началу |
|
|
GribUser Автор формата FB2 - Автор библиотеки FB
Зарегистрирован: 30.09.2004 Сообщения: 2475 Откуда: Москва
|
Добавлено: Пт Апр 07, 2006 14:30 Заголовок сообщения: |
|
|
vvv писал(а): | Но помню, сколько мне трудов стоило приручение IE на предмет корректного интерактивного редактирования. | У меня об источнике твоих трудностей с IE имеется своя версия . Вероятность же получить глюки на выходе при работе с DOM минимальна для новичка, на мой взгляд... Ну тут все от человека зависит, конечно. |
|
Вернуться к началу |
|
|
Юзич Зрелый участник форума
Зарегистрирован: 07.02.2006 Сообщения: 120 Откуда: Республика Беларусь
|
Добавлено: Пт Апр 07, 2006 20:10 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
vvv писал(а): | Юзич писал(а): |
Не стыкуется с body.document.selection.createRange().
|
Попробуйте что-нибудь типа
var rng=body.document.selection.createRange()
var htm=rng.htmlText
|
Спасибо!
После замены .text на .htmlText скрипт стал работать корректнее. В пределах секции. Я смотрел содержимое переменной, перед обратной вставкой нужно отсекать тэги <DIV class="section"> и лишние <p>, если последний абзац был выделен не целиком. Но это уже мелочи.
А вообще, надо будет хорошенько расковырять body.js ... |
|
Вернуться к началу |
|
|
vvv Автор редактора BookDesigner
Зарегистрирован: 06.10.2004 Сообщения: 349
|
Добавлено: Пт Апр 07, 2006 21:41 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
Юзич писал(а): | Спасибо!
После замены .text на .htmlText скрипт стал работать корректнее. В пределах секции. Я смотрел содержимое переменной, перед обратной вставкой нужно отсекать тэги <DIV class="section"> и лишние <p>, если последний абзац был выделен не целиком. Но это уже мелочи.
|
Эти "мелочи" - стиль работы IE в режиме редактирования с htmlText и PasteHtml. В данном случае повезло: искажения не фатальны. А может, например, сделать и вот так.
исходный html:
<p>это параграф</p>
html после htmlText и PasteHtml:
<p>это <p>параграф</p></p>
Что нормально для mshtml, но фатально для fb2...
Для того, чтобы таких вещей не было, надо работать с полными элементами. Брать их надо через дерево или расширяя Range до полного элемента. А вставлять - либо через innerHtml (что проще, но иногда глючит), либо через insertAdjacentHTML (что надежно, т.к. всегда вставляет юзерный фрагмент, но реализуется посложнее). |
|
Вернуться к началу |
|
|
Юзич Зрелый участник форума
Зарегистрирован: 07.02.2006 Сообщения: 120 Откуда: Республика Беларусь
|
Добавлено: Пн Апр 10, 2006 20:13 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
vvv писал(а): |
А может, например, сделать и вот так.
исходный html:
<p>это параграф</p>
html после htmlText и PasteHtml:
<p>это <p>параграф</p></p>
Что нормально для mshtml, но фатально для fb2...
|
Так и делает.
vvv писал(а): |
Для того, чтобы таких вещей не было, надо работать с полными элементами. Брать их надо через дерево или расширяя Range до полного элемента. А вставлять - либо через innerHtml (что проще, но иногда глючит), либо через insertAdjacentHTML (что надежно, т.к. всегда вставляет юзерный фрагмент, но реализуется посложнее). |
Это очень разумно, но надо еще озаботиться "вклейкой" отредактированного фрагмента в полный элемент. Если, допустим, выделено два полных абзаца и прловина третьго. А обратную вставку, если, опять же, допустим, выделена два абзаца секции, и часть следующего за ними элемента cite не отрабатывает корректно даже функция Copy/Paste FB Editor-а.... |
|
Вернуться к началу |
|
|
vvv Автор редактора BookDesigner
Зарегистрирован: 06.10.2004 Сообщения: 349
|
Добавлено: Пн Апр 17, 2006 20:30 Заголовок сообщения: Re: FB Editor - скрипты, вопросы... |
|
|
Юзич писал(а): | Это очень разумно, но надо еще озаботиться "вклейкой" отредактированного фрагмента в полный элемент. Если, допустим, выделено два полных абзаца и прловина третьго. А обратную вставку, если, опять же, допустим, выделена два абзаца секции, и часть следующего за ними элемента cite не отрабатывает корректно даже функция Copy/Paste FB Editor-а.... |
Поэтому и говорю, что обеспечить корректное интерактивное fb2-редактирование сложных фрагментов под IE непросто. Но если серьезно поработать, то можно. Трюк заключается в том, что первично выбранный TextRange надо расширить до полного. Полного в том смысле, что он должен включать полные html-фрагменты.
1. Начальный TextRange, выбранный мышкой, имееет входную и выходную точки. Координаты точек можно получить при помощи интерфейса HTMLWindow2 (.event.X,.event.Y), запросив их на событиях HtmlDoc_onmousedown и HtmlDoc_onmouseup.
2. Используя метод elementFromPoint, можно найти номера элементов, соответствующих входной и выходной точке.
3. Поднимаясь по дереву вверх от первого элемента и опускаясь вниз от последнего, можно найти полные начальный и конечный элементы. При помощи свойства nodeName.
4. Создать полный TextRange. При помощи метода moveToElementText. Сначала надо сделать TextRange, соответствующий полному начальному элементу (скажем, tr1). Потом TextRange, соответствующий полному конечному элементу (скажем, tr2). Затем с помошью метода setEndPoint создать полный TextRange (скажем, tr). А с tr уже можно работать методом PasteHtml, не опасаясь появления несанкционированных тэгов.
Все это, конечно, занудно. Но зато довольно эффективно давит IE-шный волюнтаризм. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|