-
Notifications
You must be signed in to change notification settings - Fork 4
/
267.txt
281 lines (204 loc) · 12 KB
/
267.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
[8] 色々な[[ソフトウェア]]で[[平文]]や[[利用者]]の入力文、
あるいは [[HTMLメール]]の[[地の文]]などから、
[[URL]] らしき部分を自動的に検出し、これを[[リンク]]として表示する[DFN[自動リンク]]機能が備わっています。
[9] 中には [[URL]] の、あるいは [[HTTP(S) URL]] など一部の [[URL]]
の構文を機械的に[[正規表現]]に変換しただけのような雑な実装もありますが、
実用上十分良好な[[利用者体験]]を提供するためには、
細かな調整が必要となります。
;; [12] 実装の中には、 [[HTML]] の[[文字参照]]への変換と [[URL自動リンク]]の処理順序が不適切であるなど、
他の処理との兼ね合いで異常な動作をしたり、[[セキュリティー]]上の問題をはらんでいたりするものもあります。
* 実装戦略
[REFS[
- [153] [CITE@en[19313 – More checks for URIs]] ([TIME[2016-03-03 16:30:00 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=19313>
- [154] [CITE@en[gecko-dev/mozTXTToHTMLConv.cpp at master · mozilla/gecko-dev]] ([TIME[2016-03-03 16:33:01 +09:00]] 版) <https://github.com/mozilla/gecko-dev/blob/master/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp#L481>
-- [155] [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/>
- [29] [CITE@ja[電子メール本文での日本語ドメイン名URL記述ガイド - 日本語.jp]]
([TIME[2015-10-15 22:13:24 +09:00]] 版)
<http://nihongojp.jp/support/mail_guide/writing.html>
- [30] [CITE[日本語ドメイン名URLクリック対応アプリケーション開発者ガイド ~メーラー編~]]
([TIME[2007-01-29 16:06:18 +09:00]] 版)
<http://nihongojp.jp/support/mail_guide/dev_guide.txt>
- [72] [CITE[Linkification of URLs - Google ドキュメント]]
( ([TIME[2014-05-24 03:35:02 +09:00]] 版))
<https://docs.google.com/document/d/1h9yPmUScIGt9gEquLjgf739GfEy8QJ6WG_hsc-OTkBU/edit?pli=1>
]REFS]
* 境界の処理
[2] 「This is great: https://example.com/great.html. Thanks!」 の最後の「.」は
[[URL]] の一部ではなく[[英文]]の一部と解釈する必要があります。
[3] とすると「See www.example.com.」も [CODE[www.example.com.]] を表すのではなさそうです。
[4] 「See https://example.com/great.html, please.」 の「,」は
[[URL]] の一部ではなく[[英文]]の一部と解釈する必要があります。
[5] 「https://example.com/page[CODE(char)[U+3000]]です」は、
[CODE(char)[U+3000]] の前までを [[URL]] と解釈する必要があります。
;; [6] [[GitHub]] はこれを正しく扱えません。 [TIME[2016-08-10T03:43:06.200Z]]
[7] 「... (https://test.test/foo)、...」
で [[GitHub]] は [CODE[)]] のあともずっと [[URL]] の一部とみなします。
[TIME[2016-08-22T14:36:26.700Z]]
[13] [[はてなブックマーク]]の[[ブックマークコメント]]では、 [[URL]] の後に「>」
があると、「>」まで [[URL]] の一部とみなします。 [TIME[2017-01-19T10:27:49.100Z]]
[14] [[掲示板]]の自動リンクで、 [CODE[#!]] のような [CODE[!]] が [[URL]]
の一部と見なされず、その直前までが [[URL]] とみなされることがあります。
[15] [[W3C]] の[[メーリングリスト]]のアーカイブ:
[CITE@en[Re: Breaking the `opener` relationship.]] ([[Mike West]]著, [TIME[2017-04-28 17:10:13 +09:00]]) <https://lists.w3.org/Archives/Public/public-webappsec/2017Apr/0078.html>
は、なぜか
> `WindowProxy`'s `[[GetOwnProperty]]` uses
https://html.spec.whatwg.org/#isplatformobjectsameorigin-(-o-): I'd just
stick with that as a determinant of the properties listed in
https://html.spec.whatwg.org/#crossoriginproperties-(-o-).
を
> `WindowProxy`'s `[[GetOwnProperty]]` uses
<https://html.spec.whatwg.org/#isplatformobjectsameorigin-(-o>-): I'd just
stick with that as a determinant of the properties listed in
<https://html.spec.whatwg.org/#crossoriginproperties-(-o>-).
と解釈します。
[19] [CITE@ja[みのさんのツイート: "https://t.co/927QpBK32e!"]]
([TIME[2017-12-23 13:27:17 +09:00]])
<https://twitter.com/mino90h/status/873210646183026689>
[20] [CODE[!]] で終わる [[URL]] を [[Twitter]] は [CODE[!]] の直前まで [[URL]] と認識。
[21] [[GitHub]] は
[CODE[href="https://example.com/">Example Web Page</a>]]
の「https:」から「Example」
までを1つの [[URL]] とみなします。
[TIME[2018-01-14T00:27:17.600Z]]
[FIG(quote)[
[FIGCAPTION[
[1] [CITE[Latest topics > Text LinkとLinkification - outsider reflex]]
([[YUKI "Piro" Hiroshi]] 著, [TIME[2016-03-03 16:56:45 +09:00]] 版)
<http://piro.sakura.ne.jp/latest/blosxom/mozilla/extension/2006-03-10_textlink.htm>
]FIGCAPTION]
> 「http://www.<em>mozilla</em>.org/」みたいに複数のテキストノードに分割されたURIも認識できる。
> 某新聞社のサイトのように「http://piro.sakura.ne.jp/」ってな全角文字で書かれたURIも認識できる。
> 2chでよくある「ttp://」で始まるURIも認識できる。ていうか最初はこれが目的だったんだよね……
]FIG]
[42]
[[LimeChat]] は
[CODE[《http://example.jp/abc-def/》]]
の最後の括弧まで
[[URL]]
と認識してしまいます。
[TIME[2020-02-17T01:19:15.400Z]]
* 非ASCII文字
[27] かつては [[URL]] には[[非ASCII文字]]は認められていなかったので、
[[日本語]]などの[[非ASCII文字]]主体の[[文章]]では
[[URL]] とその周りの区切りは比較的明確でした。
[28] ところが [[URL]] で[[非ASCII文字]]一般が認められるようになってから、
[[URL]] の直後に[[文章]]が続いているものと [[URL]] に[[非ASCII文字]]が含まれるものの区別が難しくなりました。
[31] [[素片識別子]]に[[非ASCII文字]]を含む語が書かれている場合や、
[[パス]]に[[見出し語]]が入る [[Wikipedia]] の [[URL]] の場合のように、
[[非ASCII文字]]が含まれる [[URL]] が書かれることは少なくないため、
何らかの対応は必須といえます。
* リンク回避
[22] [[自動リンク]]機能のある[[掲示板]]などの[[利用者]]は、
[[自動リンク]]を敢えて回避することを好む場合があります。
[23] そのため [CODE[http:]] の [CODE[h]] を省略した [CODE[ttp:]]
のような [[URL]] が用いられることもあります。
;; [CODE[ttp:]] 参照。
[24] しかしそうした[[自動リンク]]を回避した [[URL]] を敢えて[[自動リンク]]し[[リンク]]をたどる[[利用者]]の便を図る[[実装]]もあります。
[EG[
[43]
[[2ch]]
では[[自動リンク]]回避のため [CODE[ttp:]] [[URL]]
の文化が発達しました。
[[専用ブラウザー]]はこれを
[CODE[http:]]
[[URL]]
と解釈して[[自動リンク]]していました。
]EG]
* URL scheme の省略
[32] [[ドメイン名]]のみを書いたり、
[[ドメイン名]]から始まる不完全な [[URL]] を書いたりして[[省略][URLの省略]]して
[[HTTP(S) URL]] を表すこともあります。
[[自動リンク]]の実装の中には、そうした不完全なものも抽出しようと試みるものがあります。
* 対応する URL scheme
[10] 任意の [[URL]] を自動リンク化すると、 [CODE[:]] さえ入っていればほとんどどんな文章でも一部が
[[URL]] ということになってしまいます。
[35] 一般的な実装は特定の [[URL scheme]] のみに対応しています。
[[HTTP(S) URL]] のみに対応する最低限のものから、
それ以外の色々な [[URL]] に対応するものまであります。
[FIG(short list)[ [36] よく対応されている [[URL scheme]]
- [CODE[http:]]
- [CODE[https:]]
- [CODE[ftp:]]
- [CODE[mailto:]]
- [CODE[nntp:]]
- [CODE[news:]]
- [CODE[ttp:]]
- [CODE[ttps:]]
]FIG]
[11] [CODE(URI)@en[javascript:]] など、危険な動作を誘引する [[URL scheme]]
もあります。無邪気な実装は[[セキュリティーホール]]となりかねません。
* 区切り文字
[25] 古い [[URL]] の [[RFC]] では、[[自然言語]]文に [[URL]] を混ぜる場合は区切りとして
[CODE[<]] と [CODE[>]] で括るのが好ましいという記述がありました。
そのため [[URL]] の前後に [CODE[<]] と [CODE[>]] を書くことをよしとする人もいます。
しかしこの慣習は一般には普及しませんでしたし、
[[Web]] 技術に詳しい人の中でもそこまで有名ではありません。
(が無視するのは惜しいほどには普及しています。)
[26] [CODE[<]] と [CODE[>]] は通常の [[URL]] には含まれないものですから、
[[自動リンク]]の実装は特に考慮しなくてもこの区切り文字を意図通りに解釈すると期待されます。
しかし[[文字参照]]の扱いが杜撰な[[自動リンク]]の実装に誤解釈されることもあるようです
(例えば >>13)。
[FIG(quote)[
[FIGCAPTION[
[18] [CITE@en[RFC 7322 - rfc Style Guide]]
([TIME[2017-10-22 17:40:00 +09:00]])
<https://tools.ietf.org/html/rfc7322#section-3.3>
]FIGCAPTION]
> Angle brackets are strongly recommended around URIs '''['''STD66''']''', e.g.,
<http://example.com/>
]FIG]
* 自動リンク機能付きマーク付け言語
[33] [[Wiki構文]]など[[テキスト]]系の[[マーク付け言語]]は、
[[自動リンク]]機能を言語の一部として組み込んでいることがよくあります。
[34] [[はてな記法]]
[17] [CITE[GitHub Flavored Markdown Spec]]
([TIME[2017-05-15 12:05:46 +09:00]])
<https://github.github.com/gfm/#autolinks-extension->
* 文脈
[37] 次のような分野で使われています。
[FIG(short list)[ [38] [[自動リンク]]する場面
- [[UGC]] 系 [[Webアプリケーション]]
-- [[掲示板]]
-- [[チャット]]
-- [[コメント]]
-- [[Wiki]]
- [[MUA]] の[[本文]]表示
- [[ニュースリーダー]]の[[本文]]表示
- [[フィードリーダー]]の[[本文]]表示
- [[HTML]] の [[authoring tool]]
- [[MUA]] の本文編集
- [[IM]] の受信メッセージ
- [[IRC]] [[クライアント]]
]FIG]
* テストデータ
[REFS[
- [46] [CITE@en[tests-web/url/autolink at master · wakaba/tests-web]], [TIME[2020-02-17 10:54:26 +09:00]] <https://github.com/wakaba/tests-web/tree/master/url/autolink>
]REFS]
[47] 自動リンクテストデータ。
[[HTCT]] 形式のテストセット中に、
入力例とその[[URL自動リンク]]検出例、
[[HTML]] 変換例が記述されています。
* その他実装例
[REFS[
- [41] [CITE@en[perl-web-url/Parser.pod at master · manakai/perl-web-url]]
([TIME[2019-11-02 18:54:28 +09:00]])
<https://github.com/manakai/perl-web-url/blob/master/lib/Web/URL/Parser.pod>
- [44] [CITE@en[Web::URL::Parser]]
([TIME[2020-01-13 04:25:30 +09:00]])
<https://manakai.github.io/pod/Web/URL/Parser#member-split_by_urls>
]REFS]
[45] [[Perl]] による実装。
* 関連
[39] その他に[[メールアドレス]]や[[電話番号]] ([CODE[x-ms-format-detection]]
も参照)、
[[アプリケーション]]依存の識別子などの自動抽出・リンク化が実装されていることがあります。
[40] [[smart tag]] も参照。
* メモ
[FIG(quote)[
[FIGCAPTION[
[16] [CITE[OPMLファイルやHTML、テキストファイルからの一括登録機能の追加 - はてなアンテナ日記 - 機能変更、お知らせなど]]
([TIME[2017-05-02 08:41:21 +09:00]])
<https://hatena.g.hatena.ne.jp/hatenaantenna/20060905/1157428635>
]FIGCAPTION]
> はてなアンテナで、複数のページを一括で登録する機能を追加しました。OPMLファイルやHTML、またテキストファイルに対応しています。(テキストファイルからはURLと判別できる文字列を抽出します。)
]FIG]