STAT_CHUNK
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| idChunk | DWORD | 4 | +0 | +0 | チャンク識別子です。チャンク識別子は、現在の IFilter インターフェイスのインスタンス内で一意でなければなりません。また、チャンク識別子は昇順でなければなりません。チャンクに番号を付ける順序は、それらがソースドキュメント内に現れる順序と対応している必要があります。検索エンジンによっては、さまざまなプロパティを持つチャンク同士の近接性を利用できるものがあります。その場合、異なるプロパティを持つチャンクが出力される順序は検索エンジンにとって重要になります。 |
| breakType | CHUNK_BREAKTYPE | 4 | +4 | +4 | 直前のチャンクと現在のチャンクを区切る区切りの種類です。値は CHUNK_BREAKTYPE 列挙型のものです。 |
| flags | CHUNKSTATE | 4 | +8 | +8 | このチャンクがテキスト型のプロパティを含むのか、値型のプロパティを含むのかを示します。フラグの値は CHUNKSTATE 列挙型から取得されます。CHUNK_TEXT フラグが設定されている場合は、IFilter::GetText を使用してチャンクの内容を単語の並びとして取得します。CHUNK_VALUE フラグが設定されている場合は、IFilter::GetValue を使用して値を取得し、単一のプロパティ値として扱います。同じ内容をテキストとしても値としても扱うようにフィルターが指定する場合は、そのチャンクを 2 つの異なるチャンクとして 2 回出力し、それぞれで一方のフラグを設定する必要があります。 |
| locale | DWORD | 4 | +12 | +12 | テキストのチャンクに関連付けられた言語およびサブ言語です。チャンクのロケールは、テキストの適切な単語分割を行うためにドキュメントインデクサーによって使用されます。チャンクがテキスト型でもなく、データ型が VT_LPWSTR、VT_LPSTR、VT_BSTR の値型でもない場合、このフィールドは無視されます。 |
| attribute | FULLPROPSPEC | 32/24 | +16 | +16 | チャンクに適用されるプロパティです。FULLPROPSPEC を参照してください。同一のテキストに複数のプロパティを持たせる必要がある場合、フィルターはプロパティごとに別々のチャンクとしてそのテキストを出力する必要があります。 |
| idChunkSource | DWORD | 4 | +48 | +40 | チャンクのソースの ID です。idChunkSource メンバーの値は、チャンクの性質によって次のように異なります。
|
| cwcStartSource | DWORD | 4 | +52 | +44 | 派生チャンクのソーステキストが、ソースチャンク内のどこから始まるかを示すオフセットです。 |
| cwcLenSource | DWORD | 4 | +56 | +48 | 現在のチャンクの派生元となったソーステキストの長さ (文字数) です。値が 0 の場合は、ソーステキストと派生テキストが 1 文字ずつ対応していることを示します。0 以外の値は、そのような直接的な対応が存在しないことを意味します。 |
公式ドキュメント
チャンクの特性を記述します。
解説(Remarks)
最後の 3 つのメンバー (idChunkSource、cwcStartSource、cwcLenSource) は、派生チャンク、つまりテキストのある部分へ逆にマッピングできるチャンクのソースを記述するために使用されます。たとえば、章の見出しはテキスト型のプロパティであると同時に、内部的な値型のプロパティ (見出し) にもなり得ます。この場合、値型のプロパティである「見出し」が派生チャンクになります。現在の値型チャンク (内部的な値型プロパティに由来するもの) のテキストが何らかのテキスト型チャンクから派生している場合、そのテキストは複数回出力しなければなりません。
次の一節は、書籍においてこれがどのように起こり得るかの例です。
The small detective exclaimed, "C'est fini!"
Confessions
The room was silent for several minutes. After thinking very hard about it, the young woman asked, "But how did you know?"
この一節は、次のようにチャンクへ分割される可能性があります。
| ID | Text | BreakType | Flags | Locale | Attribute |
|---|---|---|---|---|---|
| 1 | The small dete | N/A | CHUNK_TEXT | ENGLISH_UK | CONTENT |
| 2 | ctive exclaimed, | CHUNK_NO_BREAK | N/A | N/A | N/A |
| 3 | "C'est fini!" | CHUNK_EOW | CHUNK_TEXT | FRENCH_BELGIAN | CONTENT |
| 4 | Confessions | CHUNK_EOC | CHUNK_TEXT | ENGLISH_UK | CHAPTER_NAMES |
| 5 | Confessions | CHUNK_EOP | CHUNK_TEXT | ENGLISH_UK | CONTENT |
| 6 | The room was silent for several minutes. | CHUNK_EOP | CHUNK_TEXT | ENGLISH_UK | CONTENT |
| 7 | After thinking very hard about it, the young woman asked, "But how did you know?" | CHUNK_EOS | CHUNK_TEXT | ENGLISH_UK | CONTENT |
idChunkSource、cwcStartSource、cwcLenSource が提供する情報は、ヒット箇所を強調表示する検索エンジンにとって有用です。内部的な値型のプロパティに対してクエリが実行された場合、検索エンジンは、その内部的な値型プロパティのテキストの派生元となった元のテキストを強調表示します。たとえば C++ コードのフィルターでは、内部的な値型プロパティ「関数定義」に対して MyFunction を検索したとき、ブラウザーはファイル内の関数ヘッダーを強調表示します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// PROPSPEC (x64 16 / x86 8 バイト)
typedef struct PROPSPEC {
PROPSPEC_KIND ulKind;
_Anonymous_e__Union Anonymous;
} PROPSPEC;
// FULLPROPSPEC (x64 32 / x86 24 バイト)
typedef struct FULLPROPSPEC {
GUID guidPropSet;
PROPSPEC psProperty;
} FULLPROPSPEC;
// STAT_CHUNK (x64 64 / x86 52 バイト)
typedef struct STAT_CHUNK {
DWORD idChunk;
CHUNK_BREAKTYPE breakType;
CHUNKSTATE flags;
DWORD locale;
FULLPROPSPEC attribute;
DWORD idChunkSource;
DWORD cwcStartSource;
DWORD cwcLenSource;
} STAT_CHUNK;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PROPSPEC
{
public uint ulKind;
public _Anonymous_e__Union Anonymous;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FULLPROPSPEC
{
public Guid guidPropSet;
public PROPSPEC psProperty;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STAT_CHUNK
{
public uint idChunk;
public int breakType;
public int flags;
public uint locale;
public FULLPROPSPEC attribute;
public uint idChunkSource;
public uint cwcStartSource;
public uint cwcLenSource;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PROPSPEC
Public ulKind As UInteger
Public Anonymous As _Anonymous_e__Union
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FULLPROPSPEC
Public guidPropSet As Guid
Public psProperty As PROPSPEC
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STAT_CHUNK
Public idChunk As UInteger
Public breakType As Integer
Public flags As Integer
Public locale As UInteger
Public attribute As FULLPROPSPEC
Public idChunkSource As UInteger
Public cwcStartSource As UInteger
Public cwcLenSource As UInteger
End Structureimport ctypes
from ctypes import wintypes
class PROPSPEC(ctypes.Structure):
_fields_ = [
("ulKind", wintypes.DWORD),
("Anonymous", _Anonymous_e__Union),
]
class FULLPROPSPEC(ctypes.Structure):
_fields_ = [
("guidPropSet", GUID),
("psProperty", PROPSPEC),
]
class STAT_CHUNK(ctypes.Structure):
_fields_ = [
("idChunk", wintypes.DWORD),
("breakType", ctypes.c_int),
("flags", ctypes.c_int),
("locale", wintypes.DWORD),
("attribute", FULLPROPSPEC),
("idChunkSource", wintypes.DWORD),
("cwcStartSource", wintypes.DWORD),
("cwcLenSource", wintypes.DWORD),
]#[repr(C)]
pub struct PROPSPEC {
pub ulKind: u32,
pub Anonymous: _Anonymous_e__Union,
}
#[repr(C)]
pub struct FULLPROPSPEC {
pub guidPropSet: GUID,
pub psProperty: PROPSPEC,
}
#[repr(C)]
pub struct STAT_CHUNK {
pub idChunk: u32,
pub breakType: i32,
pub flags: i32,
pub locale: u32,
pub attribute: FULLPROPSPEC,
pub idChunkSource: u32,
pub cwcStartSource: u32,
pub cwcLenSource: u32,
}import "golang.org/x/sys/windows"
type PROPSPEC struct {
ulKind uint32
Anonymous _Anonymous_e__Union
}
type FULLPROPSPEC struct {
guidPropSet windows.GUID
psProperty PROPSPEC
}
type STAT_CHUNK struct {
idChunk uint32
breakType int32
flags int32
locale uint32
attribute FULLPROPSPEC
idChunkSource uint32
cwcStartSource uint32
cwcLenSource uint32
}type
PROPSPEC = record
ulKind: DWORD;
Anonymous: _Anonymous_e__Union;
end;
FULLPROPSPEC = record
guidPropSet: TGUID;
psProperty: PROPSPEC;
end;
STAT_CHUNK = record
idChunk: DWORD;
breakType: Integer;
flags: Integer;
locale: DWORD;
attribute: FULLPROPSPEC;
idChunkSource: DWORD;
cwcStartSource: DWORD;
cwcLenSource: DWORD;
end;const PROPSPEC = extern struct {
ulKind: u32,
Anonymous: _Anonymous_e__Union,
};
const FULLPROPSPEC = extern struct {
guidPropSet: GUID,
psProperty: PROPSPEC,
};
const STAT_CHUNK = extern struct {
idChunk: u32,
breakType: i32,
flags: i32,
locale: u32,
attribute: FULLPROPSPEC,
idChunkSource: u32,
cwcStartSource: u32,
cwcLenSource: u32,
};type
PROPSPEC {.bycopy.} = object
ulKind: uint32
Anonymous: _Anonymous_e__Union
FULLPROPSPEC {.bycopy.} = object
guidPropSet: GUID
psProperty: PROPSPEC
STAT_CHUNK {.bycopy.} = object
idChunk: uint32
breakType: int32
flags: int32
locale: uint32
attribute: FULLPROPSPEC
idChunkSource: uint32
cwcStartSource: uint32
cwcLenSource: uint32struct PROPSPEC
{
uint ulKind;
_Anonymous_e__Union Anonymous;
}
struct FULLPROPSPEC
{
GUID guidPropSet;
PROPSPEC psProperty;
}
struct STAT_CHUNK
{
uint idChunk;
int breakType;
int flags;
uint locale;
FULLPROPSPEC attribute;
uint idChunkSource;
uint cwcStartSource;
uint cwcLenSource;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; STAT_CHUNK サイズ: 52 バイト(x86)
dim st, 13 ; 4byte整数×13(構造体サイズ 52 / 4 切り上げ)
; idChunk : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; breakType : CHUNK_BREAKTYPE (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; flags : CHUNKSTATE (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; locale : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; attribute : FULLPROPSPEC (+16, 24byte) varptr(st)+16 を基点に操作(24byte:入れ子/配列)
; idChunkSource : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; cwcStartSource : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; cwcLenSource : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; STAT_CHUNK サイズ: 64 バイト(x64)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; idChunk : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; breakType : CHUNK_BREAKTYPE (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; flags : CHUNKSTATE (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; locale : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; attribute : FULLPROPSPEC (+16, 32byte) varptr(st)+16 を基点に操作(32byte:入れ子/配列)
; idChunkSource : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; cwcStartSource : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; cwcLenSource : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
#field int Data1
#field short Data2
#field short Data3
#field byte Data4 8
#endstruct
#defstruct global PROPSPEC
#field int ulKind
#field byte Anonymous 8
#endstruct
#defstruct global FULLPROPSPEC
#field GUID guidPropSet
#field PROPSPEC psProperty
#endstruct
#defstruct global STAT_CHUNK
#field int idChunk
#field int breakType
#field int flags
#field int locale
#field FULLPROPSPEC attribute
#field int idChunkSource
#field int cwcStartSource
#field int cwcLenSource
#endstruct
stdim st, STAT_CHUNK ; NSTRUCT 変数を確保
st->idChunk = 100
mes "idChunk=" + st->idChunk