| author | blanchet |
| Mon, 31 Jan 2022 16:09:23 +0100 | |
| changeset 75025 | f741d55a81e5 |
| parent 74037 | c13198575f75 |
| child 75393 | 87ebf5a50283 |
| permissions | -rw-r--r-- |
|
43282
5d294220ca43
moved sources -- eliminated Netbeans artifact of jedit package directory;
wenzelm
parents:
40792
diff
changeset
|
1 |
/* Title: Tools/jEdit/src/isabelle_sidekick.scala |
| 36760 | 2 |
Author: Fabian Immler, TU Munich |
3 |
Author: Makarius |
|
4 |
||
5 |
SideKick parsers for Isabelle proof documents. |
|
6 |
*/ |
|
| 34393 | 7 |
|
|
73987
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
8 |
package isabelle.jedit_main |
| 34393 | 9 |
|
| 34760 | 10 |
|
| 36015 | 11 |
import isabelle._ |
|
73987
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
12 |
import isabelle.jedit._ |
| 36015 | 13 |
|
| 34393 | 14 |
import javax.swing.tree.DefaultMutableTreeNode |
|
34701
80b0add08eef
IsabelleSideKickParser: incorporate former MarkupNode.markup2default_node, observe stopped flag;
wenzelm
parents:
34669
diff
changeset
|
15 |
import javax.swing.text.Position |
| 74037 | 16 |
import javax.swing.Icon |
|
34417
bce2f2ea9819
misc tuning and adaption according to original IsabelleParser --
wenzelm
parents:
34408
diff
changeset
|
17 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
18 |
import org.gjt.sp.jedit.Buffer |
|
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
19 |
import sidekick.{SideKickParser, SideKickParsedData, IAsset}
|
|
34701
80b0add08eef
IsabelleSideKickParser: incorporate former MarkupNode.markup2default_node, observe stopped flag;
wenzelm
parents:
34669
diff
changeset
|
20 |
|
| 34393 | 21 |
|
|
36738
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
22 |
object Isabelle_Sidekick |
|
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
23 |
{
|
| 40477 | 24 |
def int_to_pos(offset: Text.Offset): Position = |
| 74037 | 25 |
new Position {
|
26 |
def getOffset: Text.Offset = offset |
|
27 |
override def toString: String = offset.toString |
|
28 |
} |
|
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
29 |
|
| 58526 | 30 |
def root_data(buffer: Buffer): SideKickParsedData = |
31 |
{
|
|
32 |
val data = new SideKickParsedData(buffer.getName) |
|
33 |
data.getAsset(data.root).setEnd(int_to_pos(buffer.getLength)) |
|
34 |
data |
|
35 |
} |
|
36 |
||
| 58747 | 37 |
class Keyword_Asset(keyword: String, text: String, range: Text.Range) extends IAsset |
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
38 |
{
|
| 69377 | 39 |
private val css = GUI.imitate_font_css(GUI.label_font()) |
|
59183
ec83638b6bfb
imitate font more carefully: err on smaller size;
wenzelm
parents:
59091
diff
changeset
|
40 |
|
| 74037 | 41 |
protected var _name: String = text |
42 |
protected var _start: Position = int_to_pos(range.start) |
|
43 |
protected var _end: Position = int_to_pos(range.stop) |
|
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
44 |
override def getIcon: Icon = null |
|
53973
78bbe75c8437
enforce IsabelleText font for better symbol coverage, especially on Windows;
wenzelm
parents:
53281
diff
changeset
|
45 |
override def getShortString: String = |
| 59933 | 46 |
{
|
47 |
val n = keyword.length |
|
48 |
val s = |
|
49 |
_name.indexOf(keyword) match {
|
|
50 |
case i if i >= 0 && n > 0 => |
|
| 62113 | 51 |
HTML.output(_name.substring(0, i)) + |
52 |
"<b>" + HTML.output(keyword) + "</b>" + |
|
53 |
HTML.output(_name.substring(i + n)) |
|
54 |
case _ => HTML.output(_name) |
|
| 59933 | 55 |
} |
56 |
"<html><span style=\"" + css + "\">" + s + "</span></html>" |
|
57 |
} |
|
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
58 |
override def getLongString: String = _name |
|
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
59 |
override def getName: String = _name |
| 71601 | 60 |
override def setName(name: String): Unit = _name = name |
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
61 |
override def getStart: Position = _start |
| 71601 | 62 |
override def setStart(start: Position): Unit = _start = start |
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
63 |
override def getEnd: Position = _end |
| 71601 | 64 |
override def setEnd(end: Position): Unit = _end = end |
| 57912 | 65 |
override def toString: String = _name |
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
66 |
} |
|
51618
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
67 |
|
| 58747 | 68 |
class Asset(name: String, range: Text.Range) extends Keyword_Asset("", name, range)
|
69 |
||
|
51618
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
70 |
def swing_markup_tree(tree: Markup_Tree, parent: DefaultMutableTreeNode, |
| 73340 | 71 |
swing_node: Text.Info[List[XML.Elem]] => DefaultMutableTreeNode): Unit = |
|
51618
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
72 |
{
|
|
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
73 |
for ((_, entry) <- tree.branches) {
|
|
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
74 |
val node = swing_node(Text.Info(entry.range, entry.markup)) |
|
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
75 |
swing_markup_tree(entry.subtree, node, swing_node) |
|
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
76 |
parent.add(node) |
|
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
77 |
} |
|
a3577cd80c41
tuned signature -- avoid intrusion of slightly odd Swing structures into pure Markup_Tree;
wenzelm
parents:
51493
diff
changeset
|
78 |
} |
|
36738
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
79 |
} |
|
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
80 |
|
|
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
81 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
82 |
class Isabelle_Sidekick(name: String) extends SideKickParser(name) |
|
34625
799a40faa4f1
completion: decode symbols only if isabelle encoding is active (to prevent unicode chars written back to file);
wenzelm
parents:
34612
diff
changeset
|
83 |
{
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
84 |
override def supportsCompletion = false |
|
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
85 |
|
|
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
86 |
|
|
34417
bce2f2ea9819
misc tuning and adaption according to original IsabelleParser --
wenzelm
parents:
34408
diff
changeset
|
87 |
/* parsing */ |
|
bce2f2ea9819
misc tuning and adaption according to original IsabelleParser --
wenzelm
parents:
34408
diff
changeset
|
88 |
|
| 36759 | 89 |
@volatile protected var stopped = false |
| 74037 | 90 |
override def stop(): Unit = { stopped = true }
|
|
34401
44241a37b74a
structure of markup-tree in scala, keep track of swing-nodes in background
immler@in.tum.de
parents:
34393
diff
changeset
|
91 |
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
92 |
def parser(buffer: Buffer, syntax: Outer_Syntax, data: SideKickParsedData): Boolean = false |
| 36759 | 93 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
94 |
def parse(buffer: Buffer, error_source: errorlist.DefaultErrorSource): SideKickParsedData = |
|
34625
799a40faa4f1
completion: decode symbols only if isabelle encoding is active (to prevent unicode chars written back to file);
wenzelm
parents:
34612
diff
changeset
|
95 |
{
|
|
34417
bce2f2ea9819
misc tuning and adaption according to original IsabelleParser --
wenzelm
parents:
34408
diff
changeset
|
96 |
stopped = false |
|
34625
799a40faa4f1
completion: decode symbols only if isabelle encoding is active (to prevent unicode chars written back to file);
wenzelm
parents:
34612
diff
changeset
|
97 |
|
| 38640 | 98 |
// FIXME lock buffer (!??) |
| 58526 | 99 |
val data = Isabelle_Sidekick.root_data(buffer) |
|
60272
4f72b00d9952
no GUI_Thread for SideKick parsers (in contrast to 4c8205fe3644), to avoid danger of deadlock due to nested context switch;
wenzelm
parents:
59933
diff
changeset
|
100 |
val syntax = Isabelle.buffer_syntax(buffer) |
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
101 |
val ok = |
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
102 |
if (syntax.isDefined) {
|
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
103 |
val ok = parser(buffer, syntax.get, data) |
| 58526 | 104 |
if (stopped) { data.root.add(new DefaultMutableTreeNode("<stopped>")); true }
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
105 |
else ok |
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
106 |
} |
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
107 |
else false |
| 58526 | 108 |
if (!ok) data.root.add(new DefaultMutableTreeNode("<ignored>"))
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
109 |
|
|
34417
bce2f2ea9819
misc tuning and adaption according to original IsabelleParser --
wenzelm
parents:
34408
diff
changeset
|
110 |
data |
|
bce2f2ea9819
misc tuning and adaption according to original IsabelleParser --
wenzelm
parents:
34408
diff
changeset
|
111 |
} |
| 34393 | 112 |
} |
|
36738
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
113 |
|
|
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
114 |
|
| 48718 | 115 |
class Isabelle_Sidekick_Structure( |
116 |
name: String, |
|
| 63606 | 117 |
node_name: Buffer => Option[Document.Node.Name], |
118 |
parse: (Outer_Syntax, Document.Node.Name, CharSequence) => List[Document_Structure.Document]) |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
119 |
extends Isabelle_Sidekick(name) |
| 36759 | 120 |
{
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
121 |
override def parser(buffer: Buffer, syntax: Outer_Syntax, data: SideKickParsedData): Boolean = |
| 36759 | 122 |
{
|
| 58743 | 123 |
def make_tree( |
124 |
parent: DefaultMutableTreeNode, |
|
125 |
offset: Text.Offset, |
|
| 73340 | 126 |
documents: List[Document_Structure.Document]): Unit = |
| 58743 | 127 |
{
|
| 73359 | 128 |
documents.foldLeft(offset) {
|
129 |
case (i, document) => |
|
130 |
document match {
|
|
131 |
case Document_Structure.Block(name, text, body) => |
|
132 |
val range = Text.Range(i, i + document.length) |
|
133 |
val node = |
|
134 |
new DefaultMutableTreeNode( |
|
135 |
new Isabelle_Sidekick.Keyword_Asset(name, Library.first_line(text), range)) |
|
136 |
parent.add(node) |
|
137 |
make_tree(node, i, body) |
|
138 |
case _ => |
|
139 |
} |
|
140 |
i + document.length |
|
|
40455
e035dad8eca2
default Sidekick parser based on section headings;
wenzelm
parents:
40452
diff
changeset
|
141 |
} |
| 58743 | 142 |
} |
|
40455
e035dad8eca2
default Sidekick parser based on section headings;
wenzelm
parents:
40452
diff
changeset
|
143 |
|
| 48718 | 144 |
node_name(buffer) match {
|
145 |
case Some(name) => |
|
| 63606 | 146 |
make_tree(data.root, 0, parse(syntax, name, JEdit_Lib.buffer_text(buffer))) |
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
147 |
true |
| 63606 | 148 |
case None => |
149 |
false |
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
150 |
} |
| 36759 | 151 |
} |
152 |
} |
|
|
36738
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
153 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
154 |
class Isabelle_Sidekick_Default extends |
| 63606 | 155 |
Isabelle_Sidekick_Structure("isabelle",
|
| 71601 | 156 |
PIDE.resources.theory_node_name, Document_Structure.parse_sections) |
| 63606 | 157 |
|
158 |
class Isabelle_Sidekick_Context extends |
|
159 |
Isabelle_Sidekick_Structure("isabelle-context",
|
|
| 71601 | 160 |
PIDE.resources.theory_node_name, Document_Structure.parse_blocks) |
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
161 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
162 |
class Isabelle_Sidekick_Options extends |
| 63606 | 163 |
Isabelle_Sidekick_Structure("isabelle-options",
|
| 71601 | 164 |
_ => Some(Document.Node.Name("options")), Document_Structure.parse_sections)
|
| 48718 | 165 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
166 |
class Isabelle_Sidekick_Root extends |
| 63606 | 167 |
Isabelle_Sidekick_Structure("isabelle-root",
|
| 71601 | 168 |
_ => Some(Document.Node.Name("ROOT")), Document_Structure.parse_sections)
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
169 |
|
| 63610 | 170 |
class Isabelle_Sidekick_ML extends |
171 |
Isabelle_Sidekick_Structure("isabelle-ml",
|
|
172 |
buffer => Some(PIDE.resources.node_name(buffer)), |
|
173 |
(_, _, text) => Document_Structure.parse_ml_sections(false, text)) |
|
174 |
||
175 |
class Isabelle_Sidekick_SML extends |
|
176 |
Isabelle_Sidekick_Structure("isabelle-sml",
|
|
177 |
buffer => Some(PIDE.resources.node_name(buffer)), |
|
178 |
(_, _, text) => Document_Structure.parse_ml_sections(true, text)) |
|
179 |
||
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
180 |
|
|
53281
251e1a2aa792
clarified SideKick parser name, which serves as quasi "mode" here;
wenzelm
parents:
53274
diff
changeset
|
181 |
class Isabelle_Sidekick_Markup extends Isabelle_Sidekick("isabelle-markup")
|
| 36759 | 182 |
{
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
183 |
override def parser(buffer: Buffer, syntax: Outer_Syntax, data: SideKickParsedData): Boolean = |
| 36759 | 184 |
{
|
|
55513
6d21415e3909
recovered Isabelle_Sidekick_Markup from 9c53198dbb1c: snapshot requires Swing_Thread;
wenzelm
parents:
55432
diff
changeset
|
185 |
val opt_snapshot = |
| 64813 | 186 |
Document_Model.get(buffer) match {
|
| 73367 | 187 |
case Some(model) if model.is_theory => Some(model.snapshot()) |
|
60272
4f72b00d9952
no GUI_Thread for SideKick parsers (in contrast to 4c8205fe3644), to avoid danger of deadlock due to nested context switch;
wenzelm
parents:
59933
diff
changeset
|
188 |
case _ => None |
|
55513
6d21415e3909
recovered Isabelle_Sidekick_Markup from 9c53198dbb1c: snapshot requires Swing_Thread;
wenzelm
parents:
55432
diff
changeset
|
189 |
} |
|
6d21415e3909
recovered Isabelle_Sidekick_Markup from 9c53198dbb1c: snapshot requires Swing_Thread;
wenzelm
parents:
55432
diff
changeset
|
190 |
opt_snapshot match {
|
|
6d21415e3909
recovered Isabelle_Sidekick_Markup from 9c53198dbb1c: snapshot requires Swing_Thread;
wenzelm
parents:
55432
diff
changeset
|
191 |
case Some(snapshot) => |
|
56373
0605d90be6fc
tuned signature -- more explicit iterator terminology;
wenzelm
parents:
56301
diff
changeset
|
192 |
for ((command, command_start) <- snapshot.node.command_iterator() if !stopped) {
|
| 55650 | 193 |
val markup = |
|
56301
1da7b4c33db9
more frugal merge of markup trees: filter wrt. subsequent query;
wenzelm
parents:
56299
diff
changeset
|
194 |
snapshot.state.command_markup( |
|
1da7b4c33db9
more frugal merge of markup trees: filter wrt. subsequent query;
wenzelm
parents:
56299
diff
changeset
|
195 |
snapshot.version, command, Command.Markup_Index.markup, |
| 56743 | 196 |
command.range, Markup.Elements.full) |
| 58526 | 197 |
Isabelle_Sidekick.swing_markup_tree(markup, data.root, |
198 |
(info: Text.Info[List[XML.Elem]]) => |
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
199 |
{
|
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
200 |
val range = info.range + command_start |
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
201 |
val content = command.source(info.range).replace('\n', ' ')
|
| 65130 | 202 |
val info_text = Pretty.formatted(Pretty.fbreaks(info.info), margin = 40.0).mkString |
|
36738
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
203 |
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
204 |
new DefaultMutableTreeNode( |
| 58747 | 205 |
new Isabelle_Sidekick.Asset(command.toString, range) {
|
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
206 |
override def getShortString: String = content |
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
207 |
override def getLongString: String = info_text |
| 57912 | 208 |
override def toString: String = quote(content) + " " + range.toString |
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
209 |
}) |
|
40452
45e7c2889d2f
misc tuning and simplification, using Isabelle_Sidekick.Asset (not sidekick.Asset, which is dynamically dispatched to slightly different semantics);
wenzelm
parents:
39624
diff
changeset
|
210 |
}) |
|
48717
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
211 |
} |
|
622251b2b0f1
clarified Sidekick configuration, including minor modes;
wenzelm
parents:
47749
diff
changeset
|
212 |
true |
|
55513
6d21415e3909
recovered Isabelle_Sidekick_Markup from 9c53198dbb1c: snapshot requires Swing_Thread;
wenzelm
parents:
55432
diff
changeset
|
213 |
case None => false |
| 36759 | 214 |
} |
215 |
} |
|
216 |
} |
|
|
36738
dce592144219
support several sidekick parsers -- very basic default parser;
wenzelm
parents:
36737
diff
changeset
|
217 |
|
| 52539 | 218 |
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
219 |
class Isabelle_Sidekick_News extends Isabelle_Sidekick("isabelle-news")
|
| 52539 | 220 |
{
|
|
53274
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
221 |
private val Heading1 = """^New in (.*)\w*$""".r |
|
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
wenzelm
parents:
53233
diff
changeset
|
222 |
private val Heading2 = """^\*\*\*\w*(.*)\w*\*\*\*\w*$""".r |
| 52539 | 223 |
|
224 |
private def make_node(s: String, start: Text.Offset, stop: Text.Offset): DefaultMutableTreeNode = |
|
| 58747 | 225 |
new DefaultMutableTreeNode(new Isabelle_Sidekick.Asset(s, Text.Range(start, stop))) |
| 52539 | 226 |
|
227 |
override def parser(buffer: Buffer, syntax: Outer_Syntax, data: SideKickParsedData): Boolean = |
|
228 |
{
|
|
229 |
var offset = 0 |
|
| 58542 | 230 |
var end_offset = 0 |
231 |
||
232 |
var start1: Option[(Int, String, Vector[DefaultMutableTreeNode])] = None |
|
233 |
var start2: Option[(Int, String)] = None |
|
234 |
||
| 74037 | 235 |
def close1(): Unit = |
| 58542 | 236 |
start1 match {
|
237 |
case Some((start_offset, s, body)) => |
|
238 |
val node = make_node(s, start_offset, end_offset) |
|
239 |
body.foreach(node.add(_)) |
|
240 |
data.root.add(node) |
|
241 |
start1 = None |
|
242 |
case None => |
|
243 |
} |
|
244 |
||
| 74037 | 245 |
def close2(): Unit = |
| 58542 | 246 |
start2 match {
|
247 |
case Some((start_offset, s)) => |
|
248 |
start1 match {
|
|
249 |
case Some((start_offset1, s1, body)) => |
|
250 |
val node = make_node(s, start_offset, end_offset) |
|
251 |
start1 = Some((start_offset1, s1, body :+ node)) |
|
252 |
case None => |
|
253 |
} |
|
254 |
start2 = None |
|
255 |
case None => |
|
256 |
} |
|
| 52539 | 257 |
|
258 |
for (line <- split_lines(JEdit_Lib.buffer_text(buffer)) if !stopped) {
|
|
259 |
line match {
|
|
| 74037 | 260 |
case Heading1(s) => close2(); close1(); start1 = Some((offset, s, Vector())) |
261 |
case Heading2(s) => close2(); start2 = Some((offset, s)) |
|
| 52539 | 262 |
case _ => |
263 |
} |
|
264 |
offset += line.length + 1 |
|
| 71601 | 265 |
if (!line.forall(Character.isSpaceChar)) end_offset = offset |
| 52539 | 266 |
} |
| 74037 | 267 |
if (!stopped) { close2(); close1() }
|
| 52539 | 268 |
|
269 |
true |
|
270 |
} |
|
271 |
} |
|
272 |
||
|
73987
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
273 |
class Isabelle_Sidekick_Bibtex extends SideKickParser("bibtex")
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
274 |
{
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
275 |
override def supportsCompletion = false |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
276 |
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
277 |
private class Asset(label: String, label_html: String, range: Text.Range, source: String) |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
278 |
extends Isabelle_Sidekick.Asset(label, range) {
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
279 |
override def getShortString: String = label_html |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
280 |
override def getLongString: String = source |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
281 |
} |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
282 |
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
283 |
def parse(buffer: Buffer, error_source: errorlist.DefaultErrorSource): SideKickParsedData = |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
284 |
{
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
285 |
val data = Isabelle_Sidekick.root_data(buffer) |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
286 |
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
287 |
try {
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
288 |
var offset = 0 |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
289 |
for (chunk <- Bibtex.parse(JEdit_Lib.buffer_text(buffer))) {
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
290 |
val kind = chunk.kind |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
291 |
val name = chunk.name |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
292 |
val source = chunk.source |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
293 |
if (kind != "") {
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
294 |
val label = kind + (if (name == "") "" else " " + name) |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
295 |
val label_html = |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
296 |
"<html><b>" + HTML.output(kind) + "</b>" + |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
297 |
(if (name == "") "" else " " + HTML.output(name)) + "</html>" |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
298 |
val range = Text.Range(offset, offset + source.length) |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
299 |
val asset = new Asset(label, label_html, range, source) |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
300 |
data.root.add(new DefaultMutableTreeNode(asset)) |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
301 |
} |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
302 |
offset += source.length |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
303 |
} |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
304 |
data |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
305 |
} |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
306 |
catch { case ERROR(msg) => Output.warning(msg); null }
|
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
307 |
} |
|
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
73367
diff
changeset
|
308 |
} |