[1] [[テキストエディター]]で[[表示]]・[[編集]]可能な[[ファイル]]を一般に[DFN[[RUBYB[テキストファイル]@en[text file]]]]といいます。

[2] 狭義には[[平文]]の[[ファイル]]のことを指します。広義には [[XML]] や[[バイナリデータ]]を含まない [[PostScript]]
などの[[ファイル]]も含みます。

* 仕様書

[REFS[
- [5] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#read-text>
- [17] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#script-created-parser>
- [26] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-09-30 22:54:01 +09:00]] 版) <https://html.spec.whatwg.org/#navigate>
]REFS]

* MIME 型

[3] [[平文]]の場合 [CODE(MIME)@en[[[text/plain]]]] が用いられます。また実際には[[平文]]とはいえなくても[[テキストファイル]]であれば
[CODE(MIME)@en[[[text/plain]]]] が用いられることがあります。しかし本来はそれ以外の適切な [[MIME型]]を用いるべきです。
広義の[[テキストファイル]]は [CODE(MIME)@en[[[text/*]]]] の[[MIME型]]を使うことが多いですが、
[CODE(MIME)@en[[[image/svg+xml]]]] や [CODE(MIME)@en[[[image/xbm]]]]、[CODE(MIME)@en[[[application/xml]]]]
のようにそれ以外の型を使うこともよくあります。

[20] [[Webブラウザー]]は、次の [[MIME型]]への [[navigate]] で、
[[テキストファイル]]として表示します [SRC[>>26]]。

[FIG(list middle)[
- [[JavaScript MIME型]]
- [[JSON MIME型]] ([[明示的対応JSON型]]を除く。)
- [CODE(MIME)@en[[[text/cache-manifest]]]]
- [CODE(MIME)@en[[[text/css]]]]
- [CODE(MIME)@en[[[text/plain]]]]
- [CODE(MIME)@en[[[text/vtt]]]]
]FIG]

[HISTORY[
[21] かつての [[HTML Standard]] では、 [CODE(MIME)@en[[[text/plain]]]] だけが該当するとされていました。
2015年9月に実態を踏まえて拡充されました [SRC[>>27]]。

[22] [[Gecko]] は次の [[MIME型]]を[[テキストファイル]]として扱います [SRC[>>218, >>219]]
([TIME[2015-05-07T12:35:07.100Z]]):
[FIG(middle list)[
- [CODE(MIME)@en[[[text/plain]]]]
- [CODE(MIME)@en[[[text/css]]]]
- [CODE(MIME)@en[[[text/cache-manifest]]]]
- [CODE(MIME)@en[[[application/javascript]]]]
- [CODE(MIME)@en[[[application/x-javascript]]]]
- [CODE(MIME)@en[[[text/ecmascript]]]]
- [CODE(MIME)@en[[[application/ecmascript]]]]
- [CODE(MIME)@en[[[text/javascript]]]]
- [CODE(MIME)@en[[[application/json]]]]
]FIG]

[24] [[Chrome]] は次の [[MIME型]]を[[テキストファイル]]として扱います [SRC[>>23]]。
[FIG(list middle)[
- [CODE(MIME)@en[[[application/json]]]]
- [CODE(MIME)@en[[[application/atom+xml]]]]
- [CODE(MIME)@en[[[application/rss+xml]]]]
- [CODE(MIME)@en[[[text/*]]]] のうち、未対応の一覧に含まれないもの
- [CODE(MIME)@en[[[application/*]]]] のうち、 [CODE[[[+json]]]] で終わるもの
- [[スクリプトの媒体型]]
-- [CODE(MIME)@en[[[text/ecmascript]]]]
-- [CODE(MIME)@en[[[application/javascript]]]]
-- [CODE(MIME)@en[[[application/ecmascript]]]]
-- [CODE(MIME)@en[[[application/x-javascript]]]]
-- [CODE(MIME)@en[[[text/javascript1.1]]]]
-- [CODE(MIME)@en[[[text/javascript1.2]]]]
-- [CODE(MIME)@en[[[text/javascript1.3]]]]
-- [CODE(MIME)@en[[[text/jscript]]]]
-- [CODE(MIME)@en[[[text/livescript]]]]
]FIG]

[25] 未対応のテキスト型とは次のもので、そのまま表示されることを[[利用者]]が想定しないだろうとの注釈があります [SRC[>>23]]。
[FIG(list middle)[
- [CODE(MIME)@en[[[text/calendar]]]]
- [CODE(MIME)@en[[[text/x-calendar]]]]
- [CODE(MIME)@en[[[text/x-vcalendar]]]]
- [CODE(MIME)@en[[[text/vcalendar]]]]
- [CODE(MIME)@en[[[text/vcard]]]]
- [CODE(MIME)@en[[[text/x-vcard]]]]
- [CODE(MIME)@en[[[text/directory]]]]
- [CODE(MIME)@en[[[text/ldif]]]]
- [CODE(MIME)@en[[[text/qif]]]]
- [CODE(MIME)@en[[[text/x-qif]]]]
- [CODE(MIME)@en[[[text/x-csv]]]]
- [CODE(MIME)@en[[[text/x-vcf]]]]
- [CODE(MIME)@en[[[text/rtf]]]]
- [CODE(MIME)@en[[[text/comma-separated-values]]]]
- [CODE(MIME)@en[[[text/csv]]]]
- [CODE(MIME)@en[[[text/tab-separated-values]]]]
- [CODE(MIME)@en[[[text/tsv]]]]
- [CODE(MIME)@en[[[text/ofx]]]]
- [CODE(MIME)@en[[[text/vnd.sun.j2me.app-descriptor]]]]
]FIG]
]HISTORY]

[REFS[
- [218] [CITE@en[gecko-dev/nsContentDLF.cpp at master · mozilla/gecko-dev]] ([TIME[2015-05-07 21:34:16 +09:00]] 版) <https://github.com/mozilla/gecko-dev/blob/master/layout/build/nsContentDLF.cpp#L54>
- [219] [CITE@en[gecko-dev/nsContentUtils.cpp at master · mozilla/gecko-dev]] ([TIME[2015-05-07 21:34:38 +09:00]] 版) <https://github.com/mozilla/gecko-dev/blob/master/dom/base/nsContentUtils.cpp#L3470>
- [220] [CITE[Issue 7192 - chromium - CSS files served for download, instead of displaying in browser - An open-source project to help move the web forward. - Google Project Hosting]] ([TIME[2015-05-07 21:52:46 +09:00]] 版) <https://code.google.com/p/chromium/issues/detail?id=7192>
- [23] [CITE[mime_util.cc - Code Search]] ([TIME[2015-05-07 22:06:51 +09:00]] 版) <https://code.google.com/p/chromium/codesearch#chromium/src/components/mime_util/mime_util.cc>
]REFS]

* 拡張子

[4] [[ファイル名]]の[[拡張子]]としては [DFN[[CODE(file)@en[[[.txt]]]]]] を用いることが多いですが、
広義の[[テキストファイル]]はそれぞれの適切な[[拡張子]]があることが普通です。

* DOM 構築

[6] [[navigate]] における[[テキストファイル]]の [[DOM]] の構築は、
[[HTML Standard]] で規定されています [SRC[>>5]]。

[7] これは [[HTML構文解析器]]と [[HTML文書]]を使います。

;; [[navigate]] 参照。

[HISTORY[
[16] かつては [CODE(JS)@en[[[document.open]]]] で非 [[HTML]] の時にも、同じように
[[DOM]] が構築されていました。

;; [CODE(JS)@en[[[document.open]]]] 参照。
]HISTORY]

[8] [[HTML構文解析器]]をまず次のようにしなければ[['''なりません''']] [SRC[>>5, >>17]]。
[FIG(steps)[
= [[字句化器]]が [CODE(HTMLe)@en[[[pre]]]] [[開始タグ]]字句を [[emit]] したものとします。
= [[字句化器]]が [CODE(char)[[[U+000A]]]] [[文字]]を [[emit]] したものとします。
= [[字句化器]]を [[PLAINTEXT state]] に切り替えます。
]FIG]

[9] ここで、[[構文解析器]]によって [CODE(HTMLe)@en[[[head]]]]
[[要素]]が挿入されることになりますが、
[[navigate]] ではその[[内容]]は必要に応じて作成して構いません [SRC[>>5]]。

[EG[
[10] 例えば [CODE(MIME)@en[[[text/plain]]]] 関連仕様に従ったレンダリングのための
[[CSS]] を参照できます。
]EG]

;; [15] [CODE(JS)@en[[[document.open]]]] ではこの規定はありません。

[11] [[navigate]] で入力の[[バイト列]]からどのように[[文字列]]を得るかは、 [[HTML Standard]]
としては規定せず、 [[sniffed MIME type]] の仕様に委ねています [SRC[>>5]]。

;; [12] 現実にはこの部分はどの仕様でも明確に規定されていません。
[[HTML]] の [[charset sniffing]] のうち、 [CODE(HTMLe)@en[[[meta]]]]
[[要素]]の処理を除外したものを適用するのが最も妥当でしょうか。
[[sniffed MIME type]] が [[CSS]] や [[WebVTT]] など[[文字コード]]の解釈が規定されている場合はそちらに従うのが正しいですが、
実際の [[Webブラウザー]]がそうしているのかどうかは謎です。

;; [18] [CODE(JS)@en[[[document.open]]]] では入力は[[バイト列]]ではなく[[文字列]]です。

[13] [[文書の文字符号化]]は、[[文書]]の[[復号]]に用いた[[文字符号化]]に設定しなければ[['''なりません''']] [SRC[>>5]]。

;; [14] その具体的なタイミングは規定されていませんが、 [[HTML]]
とは違って途中で[[文字符号化]]が変化することはありませんから、
決定して本体処理を開始する直前が妥当でしょう。

;; [19] [CODE(JS)@en[[[document.open]]]] では [[utf-8]] に設定されます [SRC[>>17]]。

[38] [[文字コードの判定]]については [[encoding sniffing algorithm]] 参照。

* 構造

[35] [[テキストファイル]]が[[平文]]だとは誰も[[言ってない][とは言っていない]]のである。

[FIG(short list)[ [36] [[テキストファイル]]の構造

- [[[CN[BOM]]]]
- [[[CN[EOF]]]]
- [[ファイル変数]]
-- [CODE[-*-]]
- [[モード行]]
- [[Kate Modelines]]
- [[shebang]]
- [[改頁]]
- [[自動リンク]]
- [[文字のレンダリング]]
- [[アウトラインエディター]]
- [CODE[#region]]
- [[綴り検査]]
- [[構文ハイライト]]
- [[テキストファイルの先頭]]

]FIG]

[37] [[テキストファイル]]系[[ファイル形式]]については[[ファイル形式]],
[[データ形式]],
[[マーク付け言語]]などを参照。

* 歴史

[REFS[
- [27] [CITE@en[Fix #124: make more types follow text/plain navigate logic · whatwg/html@f94f3c4]] ([TIME[2015-10-01 00:37:17 +09:00]] 版) <https://github.com/whatwg/html/commit/f94f3c4595fbc5fecb747ef52f46cdc5f2b3feec>
]REFS]

[28] [CITE@en[39042 – Display TXT using mozTXTToHTMLConv (linkify links, uris, urls in text/plain documents)]]
([TIME[2016-03-03 16:23:38 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=39042>

[29] [CITE@en[gecko-dev/mozITXTToHTMLConv.idl at master · mozilla/gecko-dev]]
([TIME[2016-03-03 16:27:45 +09:00]] 版)
<https://github.com/mozilla/gecko-dev/blob/master/netwerk/streamconv/mozITXTToHTMLConv.idl>

[30] [CITE[Ben Bucksch - Projects - Mozilla - TXT->HTML Conversion]]
([TIME[2008-09-23 10:39:27 +09:00]] 版)
<http://www.bucksch.org/1/projects/mozilla/16507/>

[31] [CITE@en[RFC 5507 - Design Choices When Expanding the DNS]]
( ([TIME[2017-04-23 20:17:02 +09:00]]))
<https://tools.ietf.org/html/rfc5507>

[32] [CITE@en[Remove processing for document.open()'s type parameter]]
([[annevk]]著, [TIME[2018-03-14 18:28:06 +09:00]])
<https://github.com/whatwg/html/commit/ac52e65a6a37b6c4163de32082a50c7da15c6c96>

[33] [CITE@en[document.open() doesn't set contentType (document's content type) · Issue #3546 · whatwg/html]]
([TIME[2018-03-17 17:34:28 +09:00]])
<https://github.com/whatwg/html/issues/3546>

[34] [CITE@en[Remove processing for document.open()'s type parameter by annevk · Pull Request #3559 · whatwg/html]]
([TIME[2018-03-17 17:34:55 +09:00]])
<https://github.com/whatwg/html/pull/3559>