Silk Performer には、解析された URL (カスタム URL とも呼ばれる) を検出する HTML パーサーがあります。埋め込みオブジェクト、フレーム、リンク、フォームに加え、解析された URL も HTML パーサーによって検出される HTML 要素のカテゴリの 1 つです。
HTML パーサーによるカスタム URL の解析を有効にするには、ページレベルのカスタム URL 解析関数の前に、解析ルールを指定する必要があります。この目的に使用する API 関数は WebPageParseUrl です。WebPageParseUrl は WebParseDataBound 関数と同様の動作をします。
解析された URL は名前を取得します (これはリンクの名前に対応します)。名前は WebPageParseUrl の最初のパラメータで指定します。2 番目および 3 番目のパラメータは左側および右側の境界線です。4 番目のパラメータはオプションです (境界を解析する際に空白スペースを無視するなど)。
最初の URL が見つかった後にも解析は停止されないため、単一のカスタム URL 解析の仕様でも複数の URL を解析することができます。ページレベルの API 呼び出しの前には複数の WebPageParseUrl 文を配置でき、その結果、ページのダウンロード中には複数の解析ルールを同時に適用することになります。
カスタム URL の解析で HTML パーサーは、リンクとフレームの相対 URL の解決に有効なルールと同じルールを適用します。これは、たとえば、ファイル名のみについて解析を行うことで、完全な絶対 URL を受け取ることができるということになります。
例:次の HTML ドキュメントはログイン フォームを送信することで生成されました。基本 URL は http://www4.company.com/user/6543/navigation.asp となります。
<a href="JavaScript:window.open('account.asp')">Edit Account</a>
ユーザーがリンクをクリックすると、ブラウザが新しいブラウザ ウィンドウで URL http://www4.company.com/user/6543/account.asp を開きます。
これは、Silk Performer で次のようにモデル化できます。
WebPageParseUrl("Javascript window open", "open('", "'"); WebPageSubmit("login", FORM_LOGIN, "LoginPageTimer"); // now the parsed URL is available under // the name "Javascript window open" and can be used.
一度解析されたカスタム URL はさまざまな用途に使用できます。
WEB_FLAG_PARSE_LINK フラグを使用して解析された URL は、リンクが使用されている任意の場所で使用することができます (たとえば、WebPageLink または WebPageQueryLink 関数)。WEB_FLAG_PARSE_LINK および WEB_FLAG_PARSE_URL フラグを指定しない場合は、両方のフラグがデフォルトで有効になります。
これで前述の例を完了することができます。
WebPageParseUrl("Javascript window open", "open('", "'"); WebPageSubmit("login", FORM_LOGIN, "LoginPageTimer"); WebPageLink("Javascript window open");
Silk Performer Recorder は WebPageParseUrl 呼び出しを生成し、解析された URL を WebPageLink 呼び出しに使用できます。コンテキストのない関数呼び出しを回避するために、可能な場合は常に Recorder で自動的にこの処理が行われます。
この機能を有効にするには、コンテキスト管理の詳細設定 ダイアログ ボックスで 動的なリンク解析 チェックボックスをオンにします。
タブの解析された URL は、WebPageQueryParsedUrl 関数を使用して取得し、文字列変数に保存することができます。
そのような文字列変数は、URL パラメータを必要とするすべてのページ レベルまたは低レベルの関数のパラメータとして使用したり、別の目的に使用したりできます (診断出力や StrSearchDelimited など)。
<!-- function ShowContent(url, category, vendor) { top.frames["content"].location.href= url + "?cat=" + category + "&vendor=" + vendor; } // end of script --> … <a href="JavaScript:ShowContent('products.asp', 'HD', 'IBM')"> hard discs by IBM</a> <a href="JavaScript:ShowContent('products.asp', 'HD', 'WD')"> hard discs by Western Digital</a> <a href="JavaScript:ShowContent('products.asp', 'Mon', 'Sony')"> Monitors by Sony</a>
このページへの API 呼び出しは次のようになると仮定します。
WebPageSubmit("login", FORM_LOGIN, "LoginPageTimer");
ここで、ユーザーが 2 番目のリンクをクリックすると、ブラウザによって URL http://www4.company.com/user/6543/products.asp?cat=HD&vendor=WD が content という名前のフレームに読み込まれます。解析された URL と WebPageLink アプローチは、BDL でこれをモデル化する場合には機能しません。このアプローチには、次の文字列のいずれかで境界の解析が見つかる必要があります。
しかし、これらの文字列はいずれも HTML コード内にはありません。URL の解析は不可能に思われます。以下を検討してみます。
WebPageSubmit("login", FORM_LOGIN, "LoginPageTimer"); WebPageUrl( "http://www4.company.com/user/6543/products.asp", "ProductTimer", FORM_PRODUCT_SELECT); ... dclform FORM_PRODUCT_SELECT: "cat" := "HD", "vendor" := "WD";
取得するのはコンテキストのない関数であり、この例では、URL に動的データが組み込まれています。しかしこれは改良可能です。http://www4.company.com/user/6543/products.asp?cat=HD&vendor=WD は解析できませんが、より短い URL http://www4.company.com/user/6543/products.asp がスクリプト内にあり、これは WebPageUrl 関数のパラメータとして使用できます。この URL は境界 "ShowContent('" と "'" を使用して解析できます。これにより文字列 products.asp が解析され、相対 URL を解決した後で、必要な URL を取得できます。解析されたこの URL は文字列変数にコピーでき、スクリプトにハードコートされた URL パラメータではなく、その変数を使用できます。その結果、次のスクリプトが生成されます。
var sParsedUrl : string; .. WebPageParseUrl("ShowContent", "ShowContent('", "'"); WebPageSubmit("login", FORM_LOGIN, "LoginPageTimer"); WebPageQueryParsedUrl(sParsedUrl, sizeof(sParsedUrl), "ShowContent"); WebPageUrl(sParsedUrl, "ProductTimer", FORM_PRODUCT_SELECT); .. dclform FORM_PRODUCT_SELECT: "cat" := "HD", "vendor" := "WD";
ここでのメリットは、「半分だけコンテキストを持つ」と言えるコンテキストのない関数呼び出しが行われるということです。クエリ文字列には依然としてコンテキストはありませんが、URL が解析されるため、URL の動的データを適切に処理することができます。
別の例では、URL が動的ではなくても、クエリ文字列には動的データが含まれることも考えられます。そのような場合は、ここで紹介した手法ではコンテキスト管理を改善できません。