dtmpl / html


html.d

タグ内の空白文字や、アトリビュートの""等の有無など、完全に復元することが出来るHTMLパーサです。パース結果は、Node配列として帰ります。メモリに溜め込むのでメモリは食います。

コメント

  • TagNode?.toDom()とnewTagNode?(Dom dom)があることで、モジュールとしての独立性を落としてる気がする。 -- sakurai? 2004-10-15 (金) 17:40:42
  • エラー処理がどうなってるのかが疑問だ。 -- sakurai? 2004-10-15 (金) 17:41:24
  • サンプルコードが欲しい。 -- sakurai? 2004-10-15 (金) 17:42:28

目次

class DefTag?

HTMLパーサー用タグ定義クラス

char[] start

タグの開始文字


char[] end

タグの終了文字

bool hasName

タグが名前を持つかどうかのフラグ

bool ignore

タグ名、アトリビュート名は大文字、小文字関係ないかどうかを示す

bool hasAttr

アトリビュートを持つかどうかを示す

bool hasChild

タグ内にさらにタグを含むかどうかを示す


bool child

他のタグ内に入ることが出来るかどうかを示す

bool script

htmlのスクリプトタグかどうかを示す

Node[] node

TODO:わからないので調査して埋めること

DefTag? endTag

対応する終了タグを持つときには、その定義が入る

bool isEndTag?

終了タグかどうかを示す


enum

  • HASNAME タグに名前があるフラグ
  • HASATTR タグにアトリビュートがあるフラグ
  • IGNORE タグの名前は大文字、小文字を無視するフラグ
  • HASCHILD タグ内にタグを内包するフラグ
  • CHILD タグ内にタグを内包されるフラグ
  • SCRIPT 開始タグ後の文字列は、JavaScript?として処理するフラグ

this(char[]start,char[]end,int flag)

コンストラクタ

  • start タグの開始文字列を指定する
  • end タグの終了文字列を指定する
  • flag タグの属性フラグ
    HASNAME,HASATTR,IGNORE,HASCHILD,CHILD,SCRIPTをORで結んで指定します。

this(char[]start,char[]end,int flag,DefTag? endTag)

終了タグ付き、コンストラクタ

  • start タグの開始文字列を指定する
  • end タグの終了文字列を指定する
  • flag タグの属性フラグ HASNAME,HASATTR,IGNORE,HASCHILD,CHILD,SCRIPTをORで結んで指定します。
  • endTag タグに対応する終了タグを指定します。

abstract class Node

HTMLのノードを示す親クラスです。

enum

  • TEXTNODE テキストノードを示すタイプです。
  • TAGNODE タグノードを示すタイプです。

class TextNode?:Node

テキストノードを示すクラスです。

char[] text

テキストノードのテキストデータです。

this()

コンストラクタ

char[] toString()

文字列取得

テキストノードを文字列として返します。

class Attr

htmlのアトリビュートを示すクラスです。TagNode?に含まれます。

+--start
|+--name
||   +--attr[0].space0
||   |+-attr[0].name
||   ||+attr[0].space1
||   ||| +attr[0].value
||   ||| |   +attr[0].space2
||   ||| |   |           +--end
||   ||| |   |           |
<name a="data"  b="data" >
              | || |   ||
              | || |   |+--endspace
              | || |   +attr[1].space2
              | || +attr[1].value
              | |+attr[1].space1
              | +-attr[1].name
              +-attr[1].space0

char[] space0

アトリビュート名の前の空白文字列を示します。

char[] name

アトリビュート名を示します。

char[] space1

アトリビュート名の後ろの空白文字、イコール、ダブルクォーテーションの位置に入る文字列を示します。

char[] value

アトリビュート値を示します。

char[] space2

アトリビュート値の後ろのダブルクォーテーションの位置に入る文字列を示します。


this()

コンストラクタ

this(char[] name, char[] value)

コンストラクタ

  • name アトリビュート名
  • value アトリビュート値

アトリビュートを作成して返します。 ここで返るアトリビュートを文字列に変換すると以下のようになります。

' name="value"'

内部データ

space0=" " name="name" space1="=\"" value="value" space2="\""

Attr copy(Attr attr)

アトリビュートコピー

  • attr アトリビュート

指定アトリビュートのコピーを返します。引数のアトリビュートのコピーを返します。 内部データは変りません?TODO:実装を調べて着実にすること。

char[] toString()

文字列取得

アトリビュートを文字列に変換して返します。

class TagNode?:Node

HTMLのタグを示すクラスです。

+--start
|+--name
||   +--attr[0].space0
||   |+-attr[0].name
||   ||+attr[0].space1
||   ||| +attr[0].value
||   ||| |   +attr[0].space2
||   ||| |   |           +--end
||   ||| |   |           |
<name a="data"  b="data" >
              | || |   ||
              | || |   |+--endspace
              | || |   +attr[1].space2
              | || +attr[1].value
              | |+attr[1].space1
              | +-attr[1].name
              +-attr[1].space0

char[] start

タグの開始文字列を示します。

char[] name

タグの名前を示します。

Attr[] attr

タグ内に含まれるアトリビュートの配列です。

char[] endspace

アトリビュート後に入る空白文字を示します。

char[] end

タグの終了を示す文字列を指定します。

DefTag? deftag

タグの定義に使ったタグ定義クラスです。

Attr[char[]] attrHash

アトリビュートの名前からアトリビュートを取得できる連想配列です。

this()

コンストラクタ

this(Dom dom)

コンストラクタ

  • dom XML

指定XMLを元に、TagNode?を作成します。

作成に失敗した場合は、Exceptionを投げます。

char[] toString()

文字列取得

タグを文字列に変換して返します。

char[] getAttr(char[] name)

アトリビュート取得

  • name アトリビュート名

指定アトリビュート名のアトリビュート値を取得します。

void setAttr(Attr a)

アトリビュート設定

  • a アトリビュート

アトリビュートをタグノード内に設定します。

void setAttr(char[] name,char[] value)

アトリビュート設定

  • name アトリビュート名
  • value アトリビュート値

指定アトリビュート名のアトリビュートに値を設定します。 指定アトリビュート名のアトリビュートがなければ、作成します。

void removeAttr(char[] name)

アトリビュート削除

  • name アトリビュート名

指定アトリビュート名のアトリビュートをタグノード内から消し去ります。

TagNode? copy(TagNode? node)

タグノードコピー

  • node タグノード

指定タグノードのコピーを返します。

Dom toDom()

XML取得

タグノードをXMLのDomに変換して返します。 この返されるXMLイメージは以下の例のように変換されます。

<name a="data"  b="data" >

<tag name="name" start="&lt;" end="&gt;" endspace=" ">
  <a space2="&quot;" space1="=&quot;" value="data" space0=" "/>
  <b space2="&quot;" space1="=&quot;" value="data" space0="  "/>
</tag>

変換プログラムサンプル

import html;
import dom;
import std.string;

void main()
{
	HTMLParser p = new HTMLParser();
	Node node[] = p.parse(`<name a="data"  b="data" >`);
	printf("%.*s\n",(cast(TagNode)node[0]).toDom().toStringln());
}

TagNode? newTagNode?(Dom dom)

タグノード作成

  • dom TagNode?のXML表現文字列

TagNode?のXML表現からTagNode?に変換して返します。

<tag name="name" start="&lt;" end="&gt;" endspace=" ">
  <a space2="&quot;" space1="=&quot;" value="data" space0=" "/>
  <b space2="&quot;" space1="=&quot;" value="data" space0="  "/>
</tag>

<name a="data"  b="data" >

class HTMLParser

HTMLパーサークラスです。

タグ内の空白文字や、アトリビュートの""等の有無など、完全に復元することが出来るのが特徴です。パース結果は、Node配列として帰ります。メモリに溜め込むのでメモリは食います。

enum

  • TEXT パース時のテキスト状態
  • TAG_START パース時のタグ開始位置状態
  • TAG_NAME パース時のタグ名の状態
  • ATTR_SPACE0 アトリビュート名の前の空白文字列状態
  • ATTR_NAME アトリビュート名の状態
  • ATTR_SPACE1_SPACE1 アトリビュート名後の空白文字の状態
  • ATTR_SPACE1_EQUAL アトリビュート名後のイコール文字列の状態
  • ATTR_SPACE1_SPACE2 アトリビュート名後のイコールの後ろの空白文字列状態
  • ATTR_SPACE1_QUOT アトリビュート名後のイコールの後のダブルクォーテーション状態
  • ATTR_VALUE アトリビュート値の状態
  • ATTR_SPACE2_QUOT アトリビュート値後のダブルクォーテーションの状態
  • ATTR_VALUE2 ダブルクォーテーションでくくらないアトリビュート値の状態

this()

コンストラクタ

デフォルトのタグ定義を使わずに自分で定義したタグ定義を用いる場合に使います。

static Node[] parse(char[] str)

パース

  • str html文字列

html文字列をパースして、Node配列を返します。

static Node[] parse(char[] str,DefTag?[] deftags)

パース

  • str html文字列
  • deftags タグ定義リスト

html文字列をパースして、Node配列を返します。タグの定義はタグ定義リストを用います。

void main()

テスト用メイン

dmd src/html src/dom -version=HTML_TEST

としてコンパイルした場合に実行されます。

変更履歴

  • parseはstaticに使えるように変更。 -- sakurai? 2004-10-18 (月) 03:16:50
  • paseはstaticに使えるように変更したため、HTMLParser.this(DefTags?)は削除。変りに、HTMLParser.parse(char[],DefTags?)を追加 -- sakurai? 2004-10-18 (月) 03:18:12
  • HtmlParser?をHTMLParserに名前変更 -- sakurai? 2004-10-18 (月) 03:20:57

*MenuBar

人気の10件

  • counter: 5346
  • today: 1
  • yesterday: 0
  • online: 1