src/Pure/Thy/thy_edit.ML
author paulson
Fri, 05 Oct 2007 09:59:03 +0200
changeset 24854 0ebcd575d3c6
parent 23803 11bf7af10ec8
child 26881 bb68f50644a9
permissions -rw-r--r--
filtering out some package theorems
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
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    15
  datatype item_kind = Whitespace | Junk | Commandspan of string
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    16
  type item = item_kind * OuterLex.token list
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    17
  val item_source: Position.T -> (string, 'a) Source.source ->
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    18
    (item, (OuterLex.token, Position.T * (Symbol.symbol, (string, 'a) Source.source) Source.source)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    19
      Source.source) Source.source
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    20
  val parse_items: Position.T -> (string, 'a) Source.source -> item list
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    21
  val present_item: item -> output
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    22
  val present_html: Path.T -> Path.T -> unit
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    23
end;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    24
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    25
structure ThyEdit: THY_EDIT =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    26
struct
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    27
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    28
structure T = OuterLex;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    29
structure P = OuterParse;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    30
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    31
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    32
(** tokens **)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    33
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    34
(* parse *)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    35
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    36
fun token_source pos src =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    37
  Symbol.source true src
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    38
  |> T.source (SOME false) OuterSyntax.get_lexicons pos;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    39
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    40
fun parse_tokens pos src = Source.exhaust (token_source pos src);
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    41
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    42
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    43
(* present *)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    44
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    45
local
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    46
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    47
val token_kind_markup =
23730
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    48
 fn T.Command   => (Markup.commandN, [])
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    49
  | T.Keyword   => (Markup.keywordN, [])
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    50
  | T.String    => Markup.string
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    51
  | T.AltString => Markup.altstring
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    52
  | T.Verbatim  => Markup.verbatim
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    53
  | T.Comment   => Markup.comment
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    54
  | T.Sync      => Markup.control
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    55
  | T.Malformed => Markup.malformed
8866c87d1a16 treat OuterLex.Error;
wenzelm
parents: 23726
diff changeset
    56
  | T.Error _   => Markup.malformed
23790
97e41d168311 tuned markup;
wenzelm
parents: 23730
diff changeset
    57
  | T.EOF       => Markup.control
97e41d168311 tuned markup;
wenzelm
parents: 23730
diff changeset
    58
  | _           => Markup.none;
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    59
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    60
in
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    61
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    62
fun present_token tok =
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    63
  Markup.enclose (token_kind_markup (T.kind_of tok)) (Output.output (T.unparse tok));
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    64
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    65
end;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    66
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
(** items **)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    70
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    71
datatype item_kind = Whitespace | Junk | Commandspan of string;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    72
type item = item_kind * OuterLex.token list;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    73
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    74
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    75
(* parse *)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    76
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    77
local
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    78
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    79
val whitespace = Scan.many1 (T.is_kind T.Space orf T.is_kind T.Comment);
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    80
val before_command = Scan.optional whitespace [] -- Scan.ahead P.command;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    81
val body = Scan.repeat1 (Scan.unless before_command P.not_eof);
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    82
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    83
val item =
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    84
  whitespace >> pair Whitespace ||
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    85
  body >> pair Junk ||
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    86
  before_command -- P.not_eof -- Scan.optional body []
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    87
    >> (fn (((ws, name), c), bs) => (Commandspan name, ws @ [c] @ bs));
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    88
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    89
in
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
    90
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    91
fun item_source pos src =
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    92
  token_source pos src
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    93
  |> Source.source T.stopper (Scan.bulk item) NONE;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    94
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    95
end;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    96
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    97
fun parse_items pos src = Source.exhaust (item_source pos src);
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    98
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
    99
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   100
(* present *)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   101
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   102
local
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   103
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   104
fun item_kind_markup Whitespace = Markup.whitespace
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   105
  | item_kind_markup Junk = Markup.junk
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   106
  | item_kind_markup (Commandspan name) = Markup.commandspan name;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   107
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   108
in
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   109
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   110
fun present_item (kind, toks) =
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   111
  Markup.enclose (item_kind_markup kind) (implode (map present_token toks));
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   112
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   113
end;
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   114
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   115
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   116
(* HTML presentation -- example *)
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   117
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   118
fun present_html inpath outpath =
23803
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   119
  Source.exhaust (item_source (Position.path inpath) (Source.of_string (File.read inpath)))
11bf7af10ec8 tuned signature;
wenzelm
parents: 23790
diff changeset
   120
  |> HTML.html_mode (implode o map present_item)
23726
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   121
  |> enclose
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   122
    (HTML.begin_document (Path.implode (Path.base inpath)) ^ "<div class=\"source\"><pre>")
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   123
    ("</pre></div>" ^ HTML.end_document)
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   124
  |> File.write outpath;
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   125
2ebecff57b17 Basic editing of theory sources.
wenzelm
parents:
diff changeset
   126
end;