Uz Galaxy - Info Archive top BBS   RSS
Info Archive  Info Archive開発 - 24 HTML に VB のコードをカラー表示するための <vb> という仮想タグを埋め込む  

VBのTipsを公開するのに、ソースコードをカラーで掲載したいと思い、VBtoHTML 関数 を作成しました。
でも、この関数を使っても、編集上は、

リスト1
<pre>    <font color='blue'>Private</font> <font color='blue'>Sub</font> MakeInfoPage(<font color='blue'>ByVal</font> nInfoID <font color='blue'>As</font> <font color='blue'>Integer</font>)
        <font color='blue'>Dim</font> sTitle <font color='blue'>As</font> <font color='blue'>String</font>
        <font color='blue'>Dim</font> sBody <font color='blue'>As</font> <font color='blue'>String</font>

        <font color='blue'>Dim</font> sSql <font color='blue'>As</font> <font color='blue'>String</font>
</pre>

という感じの文字列になり、こうなったあとで、「ちょっと修正」というのが大変になります。


そこで、編集上は、独自に用意した、 <vb> タグを使って リスト2のように入力し、リスト3のような表示ができないかと考えました。

リスト2
<vb>
<!--
    Private Sub MakeInfoPage(ByVal nInfoID As Integer)
        Dim sTitle As String
        Dim sBody As String

        Dim sSql As String
-->
</vb>


リスト3
    Private Sub MakeInfoPage(ByVal nInfoID As Integer)
        Dim sTitle As String
        Dim sBody As String

        Dim sSql As String


そこで、必要になったのが、HTMLの解析ルーチン。
いかにして、独自のタグを認識するか。
perl なんかには HTML Parser のモジュールがあって使えるようですが、.NET から使えるものが見つけられませんでした。
(もっと探せばあると思いますが。IEが持ってそうなんですけどね。)

そこで、自分で作ることにしました。
>> オリジナル HTML Parser (HTMLファイル解析)
(まだまだスクリプトがらみに自信がないし、br,img,hr,meta の省略タグには対応したが、そのほかは、 /> で終わらせないと正しく認識しないなど、改良の余地はありますが。)

これを使って、HTMLファイル生成時に、HTMLファイルを解析し、vb タグを VBtoHTML を使ってカラフルなコードに置き換えています。
編集のためのデータは MDB で管理していて、こちらには変換を加えないので、入力時のすっきりしたコードのまま、再編集などが可能になります。


vbタグを展開
    ' <vb>タグを展開
    Dim html As New HtmlParser(sFileName)
    Dim oNode As HtmlNode
    For Each oNode In html.Nodes
        ConvertVBTag(oNode)
    Next
    html.Save(sFileName)

    ' vbタグを展開関数
    Private Sub ConvertVBTag(ByVal oNode As HtmlNode)
        ' コメントタグで親が vb タグなら変換を行う
        If oNode.TagType = HtmlNode.HtmlTagType.CommentTag AndAlso Not oNode.Parent Is Nothing AndAlso oNode.Parent.Name = "vb" Then
            ' vbタグ を preタグ 変更 属性情報(classやstyle)が指定されていても、引き継がれる
            oNode.Parent.Name = "pre"
            
            Dim sHtml As String = oNode.Html.Substring(4, oNode.Html.Length - 7)  ' <!-- --> をカット
            If sHtml.Substring(0, 2) = vbCrLf Then   ' 先頭の空行をカット
                sHtml = sHtml.Substring(2)
            End If

            ' VBのソースコード を カラフルな HTML へ変換
            sHtml = VBtoHTML(sHtml)
            oNode.Html = sHtml.Substring(5, sHtml.Length - 13)  ' <pre> </pre> カット

            If CType(oNode.Parent.ChildNode(oNode.Parent.ChildNode.Count - 1), HtmlNode).Html = vbCrLf Then   ' 行末の空行をカット
                CType(oNode.Parent.ChildNode(oNode.Parent.ChildNode.Count - 1), HtmlNode).Html = ""
            End If
        End If

        ' 子ノードに vbタグがないかチェックし、vbタグであれば変換する(再起呼び出し)
        Dim o As HtmlNode
        For Each o In oNode.ChildNode
            ConvertVBTag(o)
        Next
    End Sub


Copyright © 2004 Uz. All rights reserved.
http://uzgalaxy.com/
このページはInfoArchiveで作成されています。