Codice per fare in modo che un controllo DHTMLEd sostituisca le virgolette semplici con virgolette inglesi
Domanda
Ho una vecchia applicazione VB6 legacy che utilizza il controllo di modifica DHTML come editor HTML.Il controllo di modifica DHTML di Microsoft, a.k.a.DHTMLEd, probabilmente non è altro che un controllo di IE che utilizza internamente la capacità di modifica nativa di IE.
Vorrei modificare l'app per implementare le virgolette intelligenti come Word.Nello specifico, " è sostituito con “ O ” E ' è sostituito con ‘ O ’ appropriato così come è stato digitato;e se l'utente preme Ctrl+Z subito dopo la sostituzione, torna ad essere una citazione semplice.
Qualcuno ha un codice che lo fa?
Se non disponi di codice per DHTML/VB6, ma disponi di codice JavaScript che funziona in un browser con aree modificabili dal contenuto, potrei utilizzare anche quello
Soluzione
Ecco la versione 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
Nota:questa soluzione inserisce un ulteriore livello nella catena di annullamento.Ad esempio, digitando "Questo è un test" si ottiene una catena di "Questo è un test" -> "Questo è un test" -> "Questa è una prova -> “ -> " (livello extra in grassetto).Per rimuovere questo livello extra dovresti implementare una sorta di PostMessage+subclassing
soluzione che non comporta l'annullamento della pressione dei tasti nativa
modificare:Non dimenticare di includere il Controllo di modifica DHTML ridistribuibile se stai prendendo di mira Windows Vista.