src/Pure/Thy/thy_edit.ML
author wenzelm
Wed, 06 Aug 2008 00:12:26 +0200
changeset 27756 24d0e890b432
parent 27665 b9e54ba563b3
child 27770 10d84e124a2f
permissions -rw-r--r--
T.end_position_of; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Thy/thy_edit.ML
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     4
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     5
Basic editing of theory sources.
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     6
*)
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     7
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     8
signature THY_EDIT =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
     9
sig
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    10
  val token_source: Position.T -> (string, 'a) Source.source ->
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    11
    (OuterLex.token, Position.T * (Symbol.symbol, (string, 'a) Source.source) Source.source)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    12
      Source.source
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    13
  val parse_tokens: Position.T -> (string, 'a) Source.source -> OuterLex.token list
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    14
  val present_token: OuterLex.token -> output
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    15
  datatype span_kind = Command of string | Ignored | Unknown
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    16
  type span = span_kind * OuterLex.token list
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    17
  val span_range: span -> Position.range
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    18
  val span_source: Position.T -> (string, 'a) Source.source ->
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    19
    (span, (OuterLex.token, Position.T * (Symbol.symbol, (string, 'a) Source.source) Source.source)
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    20
      Source.source) Source.source
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    21
  val parse_spans: Position.T -> (string, 'a) Source.source -> span list
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    22
  val present_span: span -> output
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    23
  val present_html: Path.T -> Path.T -> unit
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    24
end;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    25
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    26
structure ThyEdit: THY_EDIT =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    27
struct
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    28
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    29
structure T = OuterLex;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    30
structure P = OuterParse;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    31
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    32
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    33
(** tokens **)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    34
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    35
(* parse *)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    36
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    37
fun token_source pos src =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    38
  Symbol.source true src
27353
71c4dd53d4cb moved global keywords from OuterSyntax to OuterKeyword, tuned interfaces;
wenzelm
parents: 26881
diff changeset
    39
  |> T.source (SOME false) OuterKeyword.get_lexicons pos;
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    40
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    41
fun parse_tokens pos src = Source.exhaust (token_source pos src);
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    42
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    43
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    44
(* present *)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    45
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    46
local
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    47
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    48
val token_kind_markup =
23730
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    49
 fn T.Command   => (Markup.commandN, [])
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    50
  | T.Keyword   => (Markup.keywordN, [])
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    51
  | T.String    => Markup.string
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    52
  | T.AltString => Markup.altstring
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    53
  | T.Verbatim  => Markup.verbatim
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    54
  | T.Comment   => Markup.comment
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    55
  | T.Sync      => Markup.control
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    56
  | T.Malformed => Markup.malformed
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    57
  | T.Error _   => Markup.malformed
23790
97e41d168311 tuned markup;
wenzelm
parents: 23730
diff changeset
    58
  | T.EOF       => Markup.control
97e41d168311 tuned markup;
wenzelm
parents: 23730
diff changeset
    59
  | _           => Markup.none;
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    60
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    61
in
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    62
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    63
fun present_token tok =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    64
  Markup.enclose (token_kind_markup (T.kind_of tok)) (Output.output (T.unparse tok));
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    65
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    66
end;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    67
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    68
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    69
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    70
(** spans **)
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    71
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    72
datatype span_kind = Command of string | Ignored | Unknown;
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    73
type span = span_kind * OuterLex.token list;
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    74
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    75
fun span_range ((_, []): span) = raise Fail "span_range: empty span"
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    76
  | span_range (_, toks) =
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    77
      let
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    78
        val start_pos = T.position_of (hd toks);
27756
24d0e890b432 T.end_position_of;
wenzelm
parents: 27665
diff changeset
    79
        val end_pos = T.end_position_of (List.last toks);
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    80
      in (start_pos, end_pos) end;
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    81
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    82
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    83
(* parse *)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    84
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    85
local
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    86
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    87
val is_whitespace = T.is_kind T.Space orf T.is_kind T.Comment;
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    88
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    89
val body = Scan.unless (Scan.many is_whitespace -- Scan.ahead (P.command || P.eof)) P.not_eof;
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    90
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    91
val span =
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    92
  Scan.ahead P.command -- P.not_eof -- Scan.repeat body
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    93
    >> (fn ((name, c), bs) => (Command name, c :: bs)) ||
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    94
  Scan.many1 is_whitespace >> pair Ignored ||
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    95
  Scan.repeat1 body >> pair Unknown;
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    96
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    97
in
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    98
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
    99
fun span_source pos src =
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   100
  token_source pos src
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   101
  |> Source.source T.stopper (Scan.bulk span) NONE;
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   102
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   103
end;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   104
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   105
fun parse_spans pos src = Source.exhaust (span_source pos src);
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   106
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   107
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   108
(* present *)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   109
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   110
local
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   111
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   112
fun kind_markup (Command name) = Markup.command_span name
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   113
  | kind_markup Ignored = Markup.ignored_span
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   114
  | kind_markup Unknown = Markup.unknown_span;
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   115
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   116
in
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   117
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   118
fun present_span (kind, toks) =
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   119
  Markup.enclose (kind_markup kind) (implode (map present_token toks));
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   120
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   121
end;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   122
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   123
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   124
(* HTML presentation -- example *)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   125
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   126
fun present_html inpath outpath =
27756
24d0e890b432 T.end_position_of;
wenzelm
parents: 27665
diff changeset
   127
  parse_spans (Path.position inpath) (Source.of_string (File.read inpath))
27665
b9e54ba563b3 renamed item to span, renamed contructors;
wenzelm
parents: 27353
diff changeset
   128
  |> HTML.html_mode (implode o map present_span)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   129
  |> enclose
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   130
    (HTML.begin_document (Path.implode (Path.base inpath)) ^ "<div class=\"source\"><pre>")
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   131
    ("</pre></div>" ^ HTML.end_document)
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   132
  |> File.write outpath;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   133
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   134
end;