C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WebBrowserを使用したエディターでの改行の変換


(過去ログ 122 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■73092 / inTopicNo.1)  WebBrowserを使用したエディターでの改行の変換
  
□投稿者/ タッチ (5回)-(2014/08/18(Mon) 16:45:35)

分類:[VB.NET/VB2005 以降] 

No73013No73026 でWebBrowserを使用したエディターについて質問したタッチと申します。
DomDocument.designMode = "On"にしたWebBrowserを用いたエディターを開発していますが、
段落の概念はそのまま利用しようと思います。
ただ、段落の改行(<p>タグの終端)と物理改行(<br>タグ)をユーザが簡単に
切り替えができるようにしたいと思います。

例えば、WebBrowser上で

    あいうえお(Enter)
    かきくけこ(Enter)
    さしすせそ

を入力した場合、内部のHTMLは、<body>以下、

    <p>あいうえお</p>
    <p>かきくけこ</p>
    <p>さしすせそ</p>

となっていますが、ここで、複数段落、例えば、

    あいうえお
    かきくけこ

の箇所を選択した場合、ボタン操作等でこれら段落を結合し、
元の段落の境目を物理改行(<br>)に変更できるようにしたいと思っています。

単純に、選択部のHTMLより"</p><p>"の箇所を"<br>"に置き換えればいい
(厳密には、"</p>\s*<p(\s+[^>]*)?>"のパターンを"<br>"に置き換える?)
と思ったのですが、例えば、「かきくけこ」の行末から

       えお
    かきくけこ

の部分を選択した場合、全体の

    あいうえお
    かきくけこ

の段落を結合したいのですが、選択部より得られるHTML(range.htmlText)は

    <p>えお</p>
    <p>かきくけこ</p>

となってしまい、単純な"</p><p>"→"<br>"の置き換えではうまくいきません。

       えお
    かきくけこ

のように中途半端な選択を行った場合でも、

    あいうえお
    かきくけこ

のエレメント全体を検出する方法、あるいは選択範囲に少しでも含まれる段落を
強制的に選択状態にするよい方法があれば教えて頂きたく、よろしくお願いします。

引用返信 編集キー/
■73094 / inTopicNo.2)  Re[1]: WebBrowserを使用したエディターでの改行の変換
□投稿者/ 魔界の仮面弁士 (82回)-(2014/08/18(Mon) 20:21:41)
No73092 (タッチ さん) に返信
> 中途半端な選択を行った場合でも、
> 
>     あいうえお
>     かきくけこ
> 
> のエレメント全体を検出する方法、あるいは選択範囲に少しでも含まれる段落を
> 強制的に選択状態にするよい方法があれば教えて頂きたく、よろしくお願いします。

これでどうでしょうか。あまりテストしていませんが。


Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        WebBrowser1.DocumentText = ""
        WebBrowser1.Document.DomDocument.designMode = "on"
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Clear()
        Dim doc As mshtml.HTMLDocument = WebBrowser1.Document.DomDocument
        Dim wkRange As mshtml.IHTMLTxtRange
        Select Case LCase(doc.selection.type)
            Case "none"
                MsgBox("未選択")
                Return
            Case "control"
                MsgBox("ControlRangeCollection")
                Return
            Case Else   'text
        End Select

        '現在の選択位置を表す TextRange
        Dim selRange As mshtml.IHTMLTxtRange = doc.selection.createRange()

        '選択開始位置の親要素
        wkRange = selRange.duplicate()
        wkRange.collapse(True)
        Dim startElement As mshtml.IHTMLElement = wkRange.parentElement()

        '選択終了位置の親要素
        wkRange = selRange.duplicate()
        wkRange.collapse(False)
        Dim endElement As mshtml.IHTMLElement = wkRange.parentElement()

        '範囲の指定
        Dim body As mshtml.IHTMLBodyElement = doc.body
        wkRange = body.createTextRange()
        wkRange.moveToElementText(startElement)
        selRange.setEndPoint("StartToStart", wkRange)
        wkRange.moveToElementText(endElement)
        selRange.setEndPoint("EndToEnd", wkRange)

        If CheckBox1.Checked Then
            '実際の選択範囲も広げる場合
            selRange.select()
        End If
        TextBox1.Text = selRange.htmlText
    End Sub
End Class

引用返信 編集キー/
■73098 / inTopicNo.3)  Re[2]: WebBrowserを使用したエディターでの改行の変換
□投稿者/ タッチ (6回)-(2014/08/19(Tue) 08:50:48)
魔界の仮面弁士様、いつもご回答ありがとうございます。
早速、頂いたサンプルを確認致します。
結果については改めて報告致します。

取り急ぎ、お礼まで。ありがとうございました。
引用返信 編集キー/
■73102 / inTopicNo.4)  Re[3]: WebBrowserを使用したエディターでの改行の変換
□投稿者/ タッチ (7回)-(2014/08/19(Tue) 10:47:48)
魔界の仮面弁士様より頂いたサンプルを参考に、
以下のようなコードで希望通りの動作を実現できました。
ありがとうございました。

なお、今回は別PCでも動作を試したいので、mshtmlの参照は行わず、
DOMに関するオブジェクトにはすべてObject型の変数を使用しましたが、
この場合、何か気をつけなければならない点はあるでしょうか?


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim doc As Object = WebBrowser1.Document.DomDocument
    Dim wkRange As Object
    Select Case LCase(doc.selection.type)
        Case "none"
            MsgBox("未選択")
            Return
        Case "control"
            MsgBox("ControlRangeCollection")
            Return
        Case Else   'text
    End Select

    '現在の選択位置を表す TextRange
    Dim selRange As Object = doc.selection.createRange()

    '選択開始位置の親要素
    wkRange = selRange.duplicate()
    wkRange.collapse(True)
    Dim startElement As Object = wkRange.parentElement()

    '選択終了位置の親要素
    wkRange = selRange.duplicate()
    wkRange.collapse(False)
    Dim endElement As Object = wkRange.parentElement()

    '範囲の指定
    Dim body As Object = doc.body
    wkRange = body.createTextRange()
    wkRange.moveToElementText(startElement)
    selRange.setEndPoint("StartToStart", wkRange)
    wkRange.moveToElementText(endElement)
    selRange.setEndPoint("EndToEnd", wkRange)

    '改行の変換
    Dim strHtml As String = Regex.Replace("" & selRange.htmlText, "</p>\s*<p(\s+[^>]*)?>", "<br>", RegexOptions.IgnoreCase)
    'System.Text.RegularExpressionsはインポート済み
    selRange.select()
    selRange.pasteHTML(strHtml)
End Sub

引用返信 編集キー/
■73120 / inTopicNo.5)  Re[4]: WebBrowserを使用したエディターでの改行の変換
□投稿者/ タッチ (8回)-(2014/08/21(Thu) 09:26:08)
あれから色々と動作確認を行い、希望通りの動きとなったことを確認致しました。
魔界の仮面弁士様、本当にありがとうございました。

今回の質問については解決しましたので、このスレッドは解決済みとさせて頂きます。
ただし、No73102 の

> なお、今回は別PCでも動作を試したいので、mshtmlの参照は行わず、
> DOMに関するオブジェクトにはすべてObject型の変数を使用しましたが、
> この場合、何か気をつけなければならない点はあるでしょうか?

についてアドバイスがございましたら、よろしくお願い致します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -