src/Pure/General/url.ML
author haftmann
Mon, 06 Feb 2017 20:56:34 +0100
changeset 64990 c6a7de505796
parent 64776 3f20c63f71be
child 68226 5ce62512de35
permissions -rw-r--r--
more explicit errors in pathological cases
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/url.ML
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     2
    Author:     Markus Wenzel, TU Muenchen
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     3
21515
43d55165b282 Comment: see RFC 2396 for relative URI syntax.
aspinall
parents: 21503
diff changeset
     4
Basic URLs, see RFC 1738 and RFC 2396.
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     5
*)
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     6
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     7
signature URL =
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
     8
sig
14909
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
     9
  datatype T =
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    10
    File of Path.T |
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    11
    Http of string * Path.T |
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    12
    Ftp of string * Path.T
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    13
  val append: T -> T -> T
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    14
  val implode: T -> string
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    15
  val explode: string -> T
54702
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    16
  val pretty: T -> Pretty.T
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    17
  val print: T -> string
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    18
end;
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    19
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    20
structure Url: URL =
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    21
struct
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    22
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    23
(* type url *)
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    24
14909
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    25
datatype T =
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    26
  File of Path.T |
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    27
  Http of string * Path.T |
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    28
  Ftp of string * Path.T;
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    29
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    30
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    31
(* append *)
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    32
64776
3f20c63f71be Windows UNC path is plain file;
wenzelm
parents: 61877
diff changeset
    33
fun append (File p) (File p') = File (Path.append p p')
3f20c63f71be Windows UNC path is plain file;
wenzelm
parents: 61877
diff changeset
    34
  | append (Http (h, p)) (File p') = Http (h, Path.append p p')
3f20c63f71be Windows UNC path is plain file;
wenzelm
parents: 61877
diff changeset
    35
  | append (Ftp (h, p)) (File p') = Ftp (h, Path.append p p')
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    36
  | append _ url = url;
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    37
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    38
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    39
(* implode *)
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    40
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    41
fun implode_path p = if Path.is_current p then "" else Path.implode p;
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    42
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    43
fun implode_url (File p) = implode_path p
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    44
  | implode_url (Http (h, p)) = "http://" ^ h ^ implode_path p
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    45
  | implode_url (Ftp (h, p)) = "ftp://" ^ h ^ implode_path p;
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    46
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    47
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    48
(* explode *)
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    49
14918
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    50
local
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    51
16195
wenzelm
parents: 15627
diff changeset
    52
val scan_host =
58854
b979c781c2db discontinued obsolete \<^sync> marker;
wenzelm
parents: 54702
diff changeset
    53
  (Scan.many1 (fn s => s <> "/" andalso Symbol.not_eof s) >> implode) --|
14918
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    54
  Scan.ahead ($$ "/" || Scan.one Symbol.is_eof);
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    55
58854
b979c781c2db discontinued obsolete \<^sync> marker;
wenzelm
parents: 54702
diff changeset
    56
val scan_path = Scan.many Symbol.not_eof >> (Path.explode o implode);
b979c781c2db discontinued obsolete \<^sync> marker;
wenzelm
parents: 54702
diff changeset
    57
val scan_path_root = Scan.many Symbol.not_eof >> (Path.explode o implode o cons "/");
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    58
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    59
val scan_url =
14909
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    60
  Scan.unless (Scan.this_string "file:" ||
988b4342ed1f tuned representation; added RemoteFile;
wenzelm
parents: 8806
diff changeset
    61
    Scan.this_string "http:" || Scan.this_string "ftp:") scan_path >> File ||
15175
b62f7b493360 Fix file:/// and file://localhost/ to give absolute paths
aspinall
parents: 15174
diff changeset
    62
  Scan.this_string "file:///" |-- scan_path_root >> File ||
b62f7b493360 Fix file:/// and file://localhost/ to give absolute paths
aspinall
parents: 15174
diff changeset
    63
  Scan.this_string "file://localhost/" |-- scan_path_root >> File ||
64776
3f20c63f71be Windows UNC path is plain file;
wenzelm
parents: 61877
diff changeset
    64
  Scan.this_string "file://" |-- scan_host -- scan_path
3f20c63f71be Windows UNC path is plain file;
wenzelm
parents: 61877
diff changeset
    65
    >> (fn (h, p) => File (Path.append (Path.named_root h) p)) ||
21503
c4ea7e8c3937 Accept URLs of form file:/home... also.
aspinall
parents: 19305
diff changeset
    66
  Scan.this_string "file:/" |-- scan_path_root >> File ||
16195
wenzelm
parents: 15627
diff changeset
    67
  Scan.this_string "http://" |-- scan_host -- scan_path >> Http ||
wenzelm
parents: 15627
diff changeset
    68
  Scan.this_string "ftp://" |-- scan_host -- scan_path >> Ftp;
14918
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    69
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    70
in
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    71
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    72
fun explode_url s = Symbol.scanner "Malformed URL" scan_url (Symbol.explode s);
6639
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    73
d399db16964c Basic URLs.
wenzelm
parents:
diff changeset
    74
end;
14918
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    75
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    76
54702
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    77
(* print *)
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    78
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    79
val pretty = Pretty.mark_str o `Markup.url o implode_url;
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    80
61877
276ad4354069 renamed Pretty.str_of to Pretty.unformatted_string_of to emphasize its meaning;
wenzelm
parents: 58854
diff changeset
    81
val print = Pretty.unformatted_string_of o pretty;
54702
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    82
3daeba5130f0 added document antiquotation @{url}, which produces formal markup for LaTeX and PIDE;
wenzelm
parents: 29606
diff changeset
    83
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    84
(*final declarations of this structure!*)
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    85
val implode = implode_url;
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    86
val explode = explode_url;
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21515
diff changeset
    87
14918
9f30a1238090 improved RemoteFile;
wenzelm
parents: 14909
diff changeset
    88
end;