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のtableaURL 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拡張かくちょうだけから移行完了いこうかんりょう推定すいていしない。