しらぎくモバイルシステム VIでのページ分割処理。

しらぎくモバイルシステム VIページの分割処理について。

端末の容量制限などを考慮してページを分割する事で、容量制限をつい越えてしまったと言う場合でも問題なく閲覧出来るようになりますし、また容量制限の厳しい旧型端末でも閲覧出来るようにしております。

ページ分割を行う条件。

ページ分割を行う条件は、以下のようになります。

端末の容量制限に達しそうになった場合
端末の容量制限を考慮して、分割を行います。
  • 実際には誤差を考慮して容量より若干小さめに分割しております。
H"またはWAP 1.0端末の場合
ページ内のフラグメントで分割します。但しその結果極端に小さな切片が生じる事となった場合には分割しません。

また、画像が連続する場合も分割が行われます。

強制分割宣言が見出された場合
文書作成者は強制分割宣言を埋め込む事で、その箇所で強制分割を行わせる事が出来ます。

但し、その結果極端に小さな切片が生じる場合には無視されます。

分割を行う箇所。

分割を行う箇所は以下のようになります(H"またはWAP 1.0端末の場合での条件は除く)。

  1. 見出しタグの直前…<h○>要素の開始タグを見出した際に、その箇所で分割するかどうかを判断します。この判断条件はかなり緩い条件ですが、見出しそのものはそれ程多くならないため、実際に見だし要素開始タグ直前で分割される事は稀のようです。
  2. ブロックレヴェル要素終了タグ, リストアイテム終了タグまたは<br>要素直後 … これらのタグを見出した場合には、その箇所で強制分割するか判断します。この判断は機会が多いため、多くの場合はこの条件で分割される事となります。
    • 但し、リストアイテム要素でも<dt>要素の終了タグでは分割判定されません。
    • リストアイテム要素(<li>要素及び<dd>要素)は終了タグが省略出来ますが(HTML 4.01など)、省略した場合には後続するリストアイテム要素の開始タグを処理する直前に同様に分割判断を行います。
    • <hr>要素は終了タグがないため(HTML 4.01など)、当該要素の処理後に分割判断を行います。
  3. タグ間のテキスト…タグ間のテキストで容量制限に達する場合にはそこで分割されます(詳細は後述)。実際にはブロックレヴェル要素終了タグ直後での分割判断がかなり緩いため、ブロックレヴェル要素の数が相当少ない場合などを除いてタグ間で分割される事は余りありません。

テキスト分割の詳細。

タグ間のテキストで分割を行う際には、以下のような条件で行われます。

  1. なるべく容量制限一杯にテキストを入れるようにして分割する…但し、普段から誤差などを考慮して制限そのものが若干緩めになっております。
  2. マルティバイト文字の途中で分割しないようにする…当たり前ですが、マルティバイト文字の途中で分割されると意味不明になるばかりか、後続するタグなどがマルティバイト文字に組込まれて誤作動あるいはエラーの原因となる事があります。このためマルティバイト文字の途中で分割しないようにします。
  3. 文字参照の途中で分割となる場合は、その直前で分割する…数値文字参照及び文字実体参照の途中で分割されると意味不明な文字列が分割点の前後に付く事になるため、分割点の末尾に文字参照らしき記述があれば、遡って次の切片に送る事とします。
  4. 半角で書かれた数値の途中では分割しない…数値情報が損なわれる恐れがあるため、半角で数値と思われる記述の途中で分割点になった場合にはその直前まで分割点を遡らせます。
  5. 分割点に非空白文字があった場合には直前の空白文字に遡って分割する…これは英語などでは空白文字で単語を分かつ習慣があるからです。
  6. 句読点で分割する…言語に応じて適切な句読点等で分割するようにします。尚、これは基本的に分割点を前に遡らせる事で実現します。

分割が行われる場合、そこまでで閉じていない要素のタグを全て閉じ、次の切片ではそれらの開始タグを全て一から書き出し直す事になります。

  • タグの包含関係を維持する必要があるため、強引にテキストのある地点で分割してと言う訳には行かず、タグを解析しながら分割を行っております。

特別な状況での分割判断。

以下の場合には分割判断が上記のものと異なります。

フォーム内では絶対に分割しません
フォームはその途中で分割されると機能を失ってしまいます。

従ってフォーム内での分割は一切行いません。

  • このため、逆に分割を強いられる大きさのフォームは出力されない事となります。
  • また、フォームの直前で強制分割が行われる事もあります。
テーブルでの分割は行単位となります
テーブルに対応している端末に対してテーブルを処理する場合、テーブルは必ず行単位で分割するかどうかを判断します。
  • テーブルの行の途中で分割すると表が崩れてしまうからです。

分割行内にrowspan属性で複数行に跨るコマがある場合は、適切に属性値を調整し、また後続の切片にも同じコマを出力します。

  • 分割されるコマにabbr属性が附与されていれば、後続の切片に入る当該コマの内容にはその値が適用されます。

また、各分割に対し、<thead>要素と<tfoot>要素に相当する行を上下に附与します。

  • 端末によっては<tfoot>要素の附与を省略する場合があります。
  • <thead>要素がない場合、一行目から連続する見出しコマのみの行を<thead>要素と見なして処理します。
  • <tfoot>要素がない場合、最終行から連続する見出しコマのみの行を<tfoot>要素と見なします。
<ol>要素内での分割について
<ol>要素内で分割が発生する場合、単純に処理しようとすると分割後リストアイテム(<li>要素)の冒頭に与えられる番号が初期値に戻ってしまいます。
  • 例えば、1., 2.、3.とリストアイテムが続いて分割されるとまた1.に戻ってしまうと言う事です。

それでは拙いので、<ol>要素内では直下の<li>要素終了タグ(終了タグが省略された場合には次の開始タグ)が現れる度に冒頭に与える番号をカウントアップし、分割があった際にはそれに合わせて<ol>要素に適切なstart属性を与える事で対処しております。

  • モバイル向けにはXHTML モバイル・プロファイル 1.0, XHTML 1.0 トランジッショナルまたはHTML 4.01 トランジッショナルのいずれかに変換されますが、いずれの文書型も<ol>要素にstart属性が定義されております。

尚、<li>要素の途中で分割される事もあり得ますが、その場合は番号が更新されないため、分割直前のリストアイテムと直後のそれには同じ番号が与えられる事になります。

強制分割宣言。

HTML文書内でより適切に分割出来るよう、注釈宣言を用いて強制的に分割を指定する事が出来ます。

  • 但し、その結果極端に小さな切片が発生してしまう場合や、フォーム内及びテーブル内等分割に特別な配慮が必要な箇所では無効となります。

それは、分割させたい箇所に

<!-- divide -->

を記述する事です。

実際の分割。

実際に分割が生じた場合、分割された切片には以下のリンクが附与されます。

冒頭部
文書の先頭及び直前の切片へのリンクが附与されます。
  • 但し、一番目の切片には附与されません。

アンカーとして、

  • 文書先頭へのリンクには文書内で一番初めに出てきた見出しの内容が、
  • 直前へのリンクにはそれまでで一番最後に出てきた見出しの内容が、

あれば利用されます。

末尾
次の切片へのリンクが附与されます。
  • 但し、最後の切片には附与されません。

分割処理に於ける注意事項。

分割処理に関して、以下の点にご留意ください。

最後に無意味な切片が生じる事があります
HTMLを分割して行くうちに、最後に無意味に小さな切片が生じる事があります。
切片へのアンカーに見出しが使われます
切片へのアンカーに見出しが使われますので、見出しを用いた構造的な記述を強く推奨します。