Код для замены в элементе управления DHTMLEd прямых кавычек фигурными кавычками

У меня есть старое, устаревшее приложение VB6, которое использует элемент управления редактированием DHTML в качестве редактора HTML. Элемент управления редактированием Microsoft DHTML, также известный как DHTMLEd, вероятно, представляет собой не что иное, как элемент управления IE, использующий собственные собственные возможности редактирования IE внутри.

Я хотел бы изменить приложение, чтобы реализовать умные кавычки, такие как Word. В частности, " заменяется на « или , а ' заменяется на или , в зависимости от того, что вводится; и если пользователь нажимает Ctrl + Z сразу после замены, это снова становится прямой цитатой.

У кого-нибудь есть код, который это делает?

Если у вас нет кода для DHTML / VB6, но есть код JavaScript, который работает в браузере с областями contentEditable, я мог бы использовать и его.

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
10
0
2 055
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот версия VB6:

Private Sub DHTMLEdit1_onkeypress()
    Dim e As Object
    Set e = DHTMLEdit1.DOM.parentWindow.event
    'Perform smart-quote replacement'
    Select Case e.keyCode
    Case 34: 'Double-Quote'
        e.keyCode = 0
        If IsAtWordEnd Then
            InsertDoubleUndo ChrW$(8221), ChrW$(34)
        Else
            InsertDoubleUndo ChrW$(8220), ChrW$(34)
        End If
    Case 39: 'Single-Quote'
        e.keyCode = 0
        If IsAtWordEnd Then
            InsertDoubleUndo ChrW$(8217), ChrW$(39)
        Else
            InsertDoubleUndo ChrW$(8216), ChrW$(39)
        End If
    End Select
End Sub

Private Function IsLetter(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function

Private Sub InsertDoubleUndo(VisibleText As String, HiddenText As String)
    Dim selection As Object
    Set selection = DHTMLEdit1.DOM.selection.createRange()
    selection.Text = HiddenText
    selection.moveStart "character", -Len(HiddenText)
    selection.Text = VisibleText
End Sub

Private Function IsAtWordEnd() As Boolean

    Dim ch As String
    ch = PreviousChar
    IsAtWordEnd = (ch <> " ") And (ch <> "")

End Function

Private Function PreviousChar() As String

    Dim selection As Object
    Set selection = m_dom.selection.createRange()
    selection.moveStart "character", -1
    PreviousChar = selection.Text

End Function

Примечание: это решение вставляет дополнительный уровень в цепочку отмены. Например, ввод «Это тест» дает цепочку «Это тест» -> «Это тест» -> "Это проверка -> «->» (дополнительный уровень выделен жирным шрифтом). Чтобы удалить этот дополнительный уровень, вам нужно будет реализовать какое-то решение PostMessage+subclassing, которое не включает отмену собственного нажатия клавиш.

edit: не забудьте включить Распространяемый компонент управления редактированием DHTML, если вы ориентируетесь на Windows Vista.

Ух ты! Спасибо! Отличная работа! Сработало с первого раза. Я все еще немного подправлю его, чтобы справиться с несколькими странными случаями, но это потрясающе.

Joel Spolsky 15.09.2008 19:03

Кстати, мне нравится реализация IsLetter () ... настоящая жемчужина программирования!

Joel Spolsky 16.09.2008 04:03

Спасибо за похвалу; никогда не думал, что услышу что-то подобное от легенды программирования :) Что касается IsLetter: используйте IsCharAlphaW или другой метод, поддерживающий Unicode. Моя реализация была быстрой и грязной, чтобы не отвлекать от сути моего ответа :)

rpetrich 18.09.2008 12:18

Другие вопросы по теме