19. HTML fragmentの構造契約こうぞうけいやく
HTML idの拡張かくちょうとfragmentの符号化規則ふごうかきそくは nepl3.safe-markup/2 とする。値あたいschemaも nepl3.markup revision 2へ進すすめ、旧きゅうrevisionの値あたいを新あたらしい検査けんさproofとして受理じゅりしない。Doc HTMLのschema参照さんしょうとportable receiverを同時どうじに更新こうしんする。
interfaces/markup.json を言語中立げんごちゅうりつの値あたいschema、nepl3-markup をnativeの検査けんさ・serializerとする。現段階げんだんかいではHTML fragmentに加くわえ、mtextにHTML phrasingを含ふくむMathML treeの構造検査こうぞうけんさとserializer、NDF codecを提供ていきょうする。Math注釈ちゅうしゃくの準備じゅんび・変換へんかん、SVG/KaTeX専用せんようprofile、DocumentShell、assetのbyte列れつ・MIME・license検査けんさ、Doc PreparedArticle、完全かんぜんな操作そうさReportは後続実装こうぞくじっそうであり、既存きそんの最終要件さいしゅうようけんから除のぞかない。MathMlFragmentはnodes・root・htmlPolicyを持もち、MathMlNodeはText・Element・Htmlの閉とじた選択せんたくである。Htmlはmtext直下ちょっかだけに置おき、rootはHTML要素ようそまたはTextとする。要求全体ようきゅうぜんたいのhtmlPolicyで許可きょかしたphrasingとして検査けんさする。全ぜんHTML出力出現しゅつりょくしゅつげんからIDとfragment参照さんしょうを集あつめ、重複じゅうふくや未解決参照みかいけつさんしょうを拒否きょひする。共有きょうゆうnodeの複数表示ふくすうひょうじも別出現べつしゅつげんとして扱あつかい、MathMLからHTMLまでの最深経路さいしんけいろを同おなじBudgetで検査けんさする。HTML部分ぶぶんは要素ようそrootにXHTML namespaceを宣言せんげんし、void要素ようそをXMLの自己終了形式じこしゅうりょうけいしきで出力しゅつりょくする。XML出力しゅつりょくのpreにはHTML parser用ようの補償改行ほしょうかいぎょうを追加ついかせず、Text rootもwrapperを追加ついかしない。外側そとがわの文書ぶんしょとのIDやresourceの整合せいごうは最終さいしゅうartifact準備じゅんびで別べつに検査けんさする。Elementのtag・attributes・childrenは型付かたつきであり、受信側じゅしんがわは選択せんたくしたschema digestの照合しょうごうと型検査かたけんさの後あとに、参照さんしょう・到達性とうたつせい・cycle・子要素数こようそすう・属性ぞくせい・深ふかさを再検査さいけんさする。MathMLの構造こうぞうproofは同おなじ不変ふへんtreeをborrowし、数式すうしきの意味いみや表示環境ひょうじかんきょうを証明しょうめいしない。
HtmlFragmentはroot U64と平坦へいたんなHtmlNode列れつを持もつ。Text、HTMLのElement、MathMLのMathElementを許ゆるす。要素ようそは固定こていtag・型付かたつきattribute列れつ・子こU64列れつを持もつ。MathElementも同おなじ平坦へいたんなarenaの子こを参照さんしょうし、HTMLとMathMLの交互こうごの入いれ子こで再帰的さいきてきな所有しょゆうやdropを増ふやさない。HTMLからはmathだけがMathMLへ入はいり、MathMLからはmtextの直下ちょっかだけがHTML phrasingを受うけ入いれる。HTML phrasingの位置いちではdisplay=blockのmathを拒否きょひする。flowの位置いちではinlineとblockのmathを受うけ入いれる。mathにdisplayが無ない場合ばあいはinlineとして扱あつかう。MathMLの属性ぞくせいと子要素こようその制約せいやくは独立どくりつしたMathML treeと共通きょうつうである。ID・fragment参照さんしょう・aやRubyの子孫制約しそんせいやく・深ふかさはnamespaceを越こえて検査けんさする。serializerはmathにMathML namespace、mtextから入はいるHTML要素ようそにXHTML namespaceを明示めいじする。Rustのenum ordinalをwireへ保存ほぞんしない。未知みちtag/attribute、RawHtml、style、event handler、script、任意にんいnamespaceを成功せいこうとして受うけ入いれない。木きの深ふかさは参照さんしょうによって表あらわし、深ふかい入力にゅうりょくのdropにRust call stackを使つかわない。
rootのBlock slotはHTML flow要素ようそ・math・Text、Phrasing slotはHTML phrasing要素ようそ・inline math・Textを取とる。P/span/見出みだし/em/strong/pre/code/aは、phrasing子こだけを持もつ。aはphrasing子孫しそんを通とおしても入いれ子こにできない。ul/olの直接子ちょくせつしはli、tableはcaption最大一さいだいひとつ・thead最大一さいだいひとつ・tbody列れつの順じゅん、thead/tbodyはtr、trはth/tdである。tbodyを省略しょうりゃくして、HTML parserの自動挿入じどうそうにゅうへ依存いぞんしない。caption内ないのtable、th内ないのsectioning/heading contentを子孫しそんまで拒否きょひする。figureのfigcaptionは最大一さいだいひとつで、先頭せんとうまたは末尾まつびに置おく。br/imgには子こを置おかない。imgはsrcとaltを必須ひっすにし、空からaltは装飾画像そうしょくがぞうとして表現ひょうげんできる。
すべての参照さんしょうを検査けんさし、cycle・未到達みとうたつnodeを拒否きょひする。DAG共有きょうゆうは各表示出現かくひょうじしゅつげんを展開てんかいして検査けんさし、同おなじnodeを二度使にどつかって同おなじidが二度出力にどしゅつりょくされる場合ばあいもDuplicateIdにする。HTMLのidは非空ひくうのXML文字列もじれつで、U+0000〜0020およびU+007F〜009Fを含ふくめない。日本語にほんご・先頭数字せんとうすうじ・大文字おおもじも保持ほじし、Unicode正規化せいきかや大小文字変換だいしょうもじへんかんをしない。DOMのid値ちはURL符号化前ふごうかまえの値あたいであり、percent escapeをdecodeしない。data-nepl-id/data-nepl-groupは、従来じゅうらいのASCII [a-z][a-z0-9-]* を維持いじする。Fragment hrefは、同おなじfragmentの実じつidへ完全一致かんぜんいっちで到達とうたつする。attributeの名前重複なまえちょうふくを拒否きょひする。
classは、HtmlPolicyに列挙れっきょされたbackend登録名とうろくめいだけを許ゆるす。名前なまえはASCII [a-z][a-z0-9-]* で、attribute内ないの空列くうれつ・重複ちょうふくを拒否きょひする。受信じゅしんしたHtmlPolicyの自己申告じこしんこくは、stylesheetの信頼しんらい・実在じつざい・内容検査ないようけんさの証明しょうめいではない。実じつhostは、独立どくりつした検査済けんさずみbackend資源しげんと照合しょうごうする。Langは共通きょうつうRFC 5646字句検査じくけんさを再利用さいりようする。roleはheading/img/group/note、aria-levelは正整数せいせいすうとする。画像がぞうwidth/heightは正整数せいせいすう、ol.startは0以上いじょうの符号付ふごうつき32bit上限以内じょうげんいない、th.scopeはrow/colだけとする。
リンクはFragment・Artifact・Externalを分わける。Artifactと画像がぞうsrcのpathは空からでない相対そうたいsegment列れつで、各かくsegmentはASCII英数字えいすうじと-_.からなり、空くうsegment/./..を禁止きんしする。これはhostが割わり当あてる配布はいふpathであり、任意にんいの著者ちょしゃpathをそのまま通とおす入口いりぐちではない。page/asset解決かいけつが非ひASCII等とうの著者ちょしゃIDから配布はいふpathへ変換へんかんし、その対応たいおうとbyte列れつを別途検査べっとけんさする。
文書間ぶんしょかんの出力しゅつりょくには BetweenArtifacts(source,target,fragment) を追加ついかする。sourceとtargetは同おなじartifact rootからのファイルpathであり、両方りょうほうに上記じょうきArtifact path字句じくを要求ようきゅうする。serializerはsourceの親おやdirectoryとtargetの共通きょうつうsegmentを取とり除のぞき、残のこるsource directoryごとに ../ を一ひとつ出力しゅつりょくし、targetの残のこりと任意にんいの #fragment を続つづける。たとえば docs/a/index.html から docs/b/index.html へは ../b/index.html となる。著者ちょしゃの ../ を未検査みけんさで出力しゅつりょくする方式ほうしきではない。固定こていorigin・root相対そうたいURL・base要素ようそを追加ついかせず、配布はいふsiteの非ひroot pathとオフラインのdirectory配置はいちを保たもつ。この相対参照そうたいさんしょうは RFC 3986のpath merge規則きそく に従したがって、閲覧先えつらんさきで解決かいけつされる。
構造検査こうぞうけんさだけでは、sourceが現在げんざいのshellの配置はいちと一致いっちすること、target/fragmentの実在じつざい、同おなじ版はんの配布物はいふぶつであることを保証ほしょうしない。Doc/page準備じゅんびと最終さいしゅうArtifact検査けんさは、現在げんざいの公開こうかいrouteをsourceへ結むすび付つけ、targetの登録とうろく・生成せいせいID・出力実在しゅつりょくじつざいを照合しょうごうする。受信値じゅしんちの自己申告じこしんこくを、この証拠しょうこにしない。BetweenArtifacts の追加ついかだけを、文書ぶんしょregistryやDocの文書間ぶんしょかんリンク解決かいけつの完成かんせいとして扱あつかわない。Fragment型がたは、引ひき続つづき同どうfragment内ないの実在じつざいIDを検査けんさする。
Externalは、現在げんざいのconstrained URI profileでは小文字こもじhttp/https/mailto scheme、ASCII、正ただしいpercent escapeのみを許ゆるす。http(s)のauthorityは、ASCII DNS/punycodeまたはIPv4表記ひょうきのhostと、省略可能しょうりゃくかのうなASCII数字列すうじれつのu16 port(符号ふごうなし)であり、userinfoは許ゆるさない。空白くうはく・backslash・不正ふせいpercent・network-path referenceを拒否きょひする。これは全ぜんURL標準ひょうじゅんのparserではない。より広ひろい正当せいとうURIの扱あつかいは、Doc preparation時じの正規化せいきかまたはprofile拡張かくちょうとして明示めいじする。リンクの存在そんざい、アクセス可否かひ、ページrevisionを構造検査こうぞうけんさから推測すいそくしない。
serializerは検査けんさproofを借用しゃくようし、HTMLのattributeをASCII名前順なまえじゅんに出力しゅつりょくする。MathMLのattributeは独立どくりつしたMathML serializerと同おなじ入力順にゅうりょくじゅんを保たもつ。13章しょうのXML文字もじ・escapeを保たもち、属性ぞくせいは二重引用符にじゅういんようふで囲かこみ、void要素ようそに終端しゅうたんtagを付つけない。HTML parserがpre開始直後かいしちょくごのLFを一ひとつ除去じょきょする規則きそくに合あわせ、pre開始かいしtag直後ちょくごへ固定こていLFを一ひとつ追加ついかして、元本文もとほんぶんの先頭改行せんとうかいぎょうを保持ほじする。doctype/head/CSP/CSSは、DocumentShellの別責務べつせきむである。
Budgetはすべての処理しょりで同おなじものを使つかい、展開てんかいした表示出現ひょうじしゅつげん、callerを含ふくむ深ふかさ、仕事量しごとりょう、割当わりあて、出力しゅつりょくを課金かきんする。Textのescapeはsemantic値ちを受うけるbyte処理しょりなので、SourceBytes/Nodes/Depthの入場にゅうじょうを代行だいこうしない。OutputBytesは各生成片かくせいせいへんの生成許可量せいせいきょかりょうであり、後段こうだんの割当停止わりあてていしでも、先さきに課金かきんした値あたいを巻まき戻もどさない。返却へんきゃくできる完全かんぜんな文字列もじれつだけを成功せいこうにする。論理ろんりAllocationUnitsは、物理ぶつりallocatorやOOMの完全かんぜんな捕捉ほそくではない。
NDFのHtmlRequest受信じゅしんは、schema検査けんさと同おなじnative構造検査こうぞうけんさを実行じっこうする。ポインタ、送信そうしんprocessの登録表とうろくひょう、以前いぜんのproofを受信時じゅしんじの根拠こんきょにしない。ただし、HtmlPolicyの信頼しんらいやasset availabilityを確定かくていする操作そうさは未完みかんであり、この値あたいboundaryを完成かんせいしたrender/provider操作そうさとして広告こうこくしない。
内容ないようモデルはHTML Standardのtable、a、URL Standardと照合しょうごうする。受入時うけいれじには実じつHTML parser/ブラウザでserializer結果けっかの構造こうぞうも照合しょうごうし、文字列一致もじれついっちだけで表示ひょうじの適合てきごうを推定すいていしない。
RubyはHTML Standardのbase/annotation群ぐんを検査けんさする。baseはRuby子孫しそんを含ふくまないphrasing列れつ、またはRuby子孫しそんを持もたない単一たんいつRuby要素ようそとする。各かくbaseにはrt列れつ、あるいはrp開始かいし・rt/rp交互列こうごれつを必須ひっすにし、空からRubyやbaseだけを拒否きょひする。rpの子こはTextだけで、annotationの直前ちょくぜん・直後ちょくごに置おく。表ひょうの全行ぜんぎょうのcell数すうは同一どういつとする。ゼロ列れつは、Doc意味いみモデルに従したがい保存ほぞんできる。これらはHTML Ruby内容ないようモデルに従したがい、ブラウザが不正ふせいmarkupを補正ほせいして表示ひょうじできることを合法性ごうほうせいの根拠こんきょにしない。
入力長にゅうりょくちょうに比例ひれいするstate初期化しょきかや子こenqueueに先立さきだって、Workを課金かきんする。小ちいさいWork上限じょうげんで大量たいりょうの処理待しょりまちを確保かくほし終おえてから停止ていしすることを避さけ、同おなじ停止理由ていしりゆうと単調たんちょうなUsageを維持いじする。
fragmentの内容ないようモデルproofは、任意深度にんいしんどのbrowser DOM保持ほじを保証ほしょうしない。独立どくりつした実じつChromium/Firefoxの検査けんさで、Div鎖くさりの深ふかさ512/600は最大さいだい511へ平坦化へいたんかされた。H1の文書ぶんしょshellとpreviewでは包囲要素ほういようそを含ふくむ出力深度しゅつりょくしんどprofileを検査けんさし、超過ちょうかを黙だまって平坦化へいたんかせず、理由付りゆうつきで扱あつかう。coreの深ふかい意味構造いみこうぞう・反復処理はんぷくしょり・dropの要件ようけんと、各出力かくしゅつりょくbackend/閲覧環境えつらんかんきょうの制約せいやくを分離ぶんりする。
Fragment・Artifact・BetweenArtifactsのfragmentは、同おなじdecoded HTML id契約けいやくに従したがう。serializerはUTF-8 byte列れつのASCII英数字えいすうじおよび-._~以外いがいを大文字おおもじhexのpercent escapeへ写うつし、その後あとHTML属性ぞくせいescapeを行おこなう。元もとのpercent文字自体もじじたいも%25へ写うつす。DOM id側がわはHTML属性ぞくせいescapeだけを行おこなう。これにより、識別値しきべつちとURL表記ひょうきを分離ぶんりする。旧見出きゅうみだしaliasの対応表たいおうひょう、実出力位置じつしゅつりょくいち・URLの互換性検査ごかんせいけんさ、Doc正本切替せいほんきりかえは別工程べつこうていであり、このID拡張かくちょうだけから移行完了いこうかんりょうを推定すいていしない。