Uz Galaxy - Info Archive top | BBS RSS |
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 http://uzgalaxy.com/
このページはInfoArchiveで作成されています。
|