src/Pure/Tools/jedit.ML
author wenzelm
Mon, 22 Feb 2021 17:19:05 +0100
changeset 73282 dcadb3243cfa
parent 71514 61882acca79b
child 73761 ef1a18e20ace
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Tools/jedit.ML
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     3
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
     4
Support for Isabelle/jEdit.
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     5
*)
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     6
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     7
signature JEDIT =
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
     8
sig
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
     9
  val get_actions: unit -> string list
61620
01db1bed4487 tuned signature;
wenzelm
parents: 61617
diff changeset
    10
  val check_action: string * Position.T -> string
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    11
end;
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    12
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    13
structure JEdit: JEDIT =
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    14
struct
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    15
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    16
(* parse XML *)
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    17
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    18
fun parse_named a (XML.Elem ((b, props), _)) =
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    19
      (case Properties.get props "NAME" of
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    20
        SOME name => if a = b then [name] else []
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    21
      | NONE => [])
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    22
  | parse_named _ _ = [];
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    23
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    24
fun parse_actions (XML.Elem (("ACTIONS", _), body)) = maps (parse_named "ACTION") body
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    25
  | parse_actions _ = [];
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    26
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    27
fun parse_dockables (XML.Elem (("DOCKABLES", _), body)) =
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    28
      maps (parse_named "DOCKABLE") body
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    29
      |> maps (fn a => [a, a ^ "-toggle", a ^ "-float"])
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    30
  | parse_dockables _ = [];
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    31
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    32
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    33
(* XML resources *)
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    34
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    35
val xml_file = XML.parse o File.read;
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    36
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    37
fun xml_resource name =
73282
wenzelm
parents: 71514
diff changeset
    38
  let
wenzelm
parents: 71514
diff changeset
    39
    val res =
wenzelm
parents: 71514
diff changeset
    40
      Isabelle_System.bash_process ("unzip -p \"$JEDIT_HOME/dist/jedit.jar\" " ^ Bash.string name);
wenzelm
parents: 71514
diff changeset
    41
    val rc = Process_Result.rc res;
wenzelm
parents: 71514
diff changeset
    42
  in
wenzelm
parents: 71514
diff changeset
    43
    res |> Process_Result.check |> Process_Result.out |> XML.parse
wenzelm
parents: 71514
diff changeset
    44
      handle ERROR _ => error ("Cannot unzip jedit.jar\nreturn code = " ^ string_of_int rc)
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    45
  end;
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    46
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    47
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    48
(* actions *)
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    49
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    50
val lazy_actions =
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    51
  Lazy.lazy (fn () =>
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    52
    (parse_actions (xml_file \<^file>\<open>~~/src/Tools/jEdit/src/actions.xml\<close>) @
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    53
      parse_dockables (xml_file \<^file>\<open>~~/src/Tools/jEdit/src/dockables.xml\<close>) @
71514
61882acca79b include actions for jEdit dockables, e.g. "vfs.browser";
wenzelm
parents: 71513
diff changeset
    54
      parse_actions (xml_resource "org/gjt/sp/jedit/actions.xml") @
61882acca79b include actions for jEdit dockables, e.g. "vfs.browser";
wenzelm
parents: 71513
diff changeset
    55
      parse_dockables (xml_resource "org/gjt/sp/jedit/dockables.xml"))
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    56
    |> sort_strings);
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    57
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    58
fun get_actions () = Lazy.force lazy_actions;
61620
01db1bed4487 tuned signature;
wenzelm
parents: 61617
diff changeset
    59
61621
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    60
fun check_action (name, pos) =
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    61
  if member (op =) (get_actions ()) name then
63681
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    62
    let
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    63
      val ((bg1, bg2), en) =
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    64
        YXML.output_markup_elem
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    65
          (Active.make_markup Markup.jedit_actionN {implicit = false, properties = []});
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    66
      val msg = "Invoke " ^ bg1 ^ name ^ bg2 ^ name ^ en ^ " jEdit action";
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    67
    in writeln (msg ^ Position.here pos); name end
61621
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    68
  else
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    69
    let
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 67463
diff changeset
    70
      val completion_report =
bf6937af7fe8 clarified signature;
wenzelm
parents: 67463
diff changeset
    71
        Completion.make_report (name, pos)
61621
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    72
          (fn completed =>
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    73
            get_actions ()
61621
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    74
            |> filter completed
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    75
            |> sort_strings
70b8085f51b4 more thorough check_action, including completion;
wenzelm
parents: 61620
diff changeset
    76
            |> map (fn a => (a, ("action", a))));
71513
a403942212f2 misc tuning and clarification;
wenzelm
parents: 69592
diff changeset
    77
    in error ("Bad jEdit action " ^ quote name ^ Position.here pos ^ completion_report) end;
61620
01db1bed4487 tuned signature;
wenzelm
parents: 61617
diff changeset
    78
63681
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    79
val _ =
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    80
  Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    81
    (Thy_Output.antiquotation_verbatim_embedded \<^binding>\<open>action\<close> (Scan.lift Args.embedded_position)
67463
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    82
      (fn ctxt => fn (name, pos) =>
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    83
        let
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    84
          val _ =
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    85
            if Context_Position.is_reported ctxt pos
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    86
            then ignore (check_action (name, pos))
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    87
            else ();
a5ca98950a91 clarified access to antiquotation options;
wenzelm
parents: 67386
diff changeset
    88
        in name end));
63681
d2448471ffba active jEdit actions;
wenzelm
parents: 63680
diff changeset
    89
61617
cd7549cd5fe7 clarified modules;
wenzelm
parents:
diff changeset
    90
end;