object Isabelle_Sidekick { def int_to_pos(offset: Text.Offset): Position = new Position { def getOffset: Text.Offset = offset overridedef toString: String = offset.toString
}
def root_data(buffer: Buffer): SideKickParsedData = { val data = new SideKickParsedData(buffer.getName)
data.getAsset(data.root).setEnd(int_to_pos(buffer.getLength))
data
}
// FIXME lock buffer (!??) val data = Isabelle_Sidekick.root_data(buffer) val syntax = Isabelle.buffer_syntax(buffer) val ok = if (syntax.isDefined) { val ok = parser(buffer, syntax.get, data) if (stopped) { data.root.add(Tree_View.Node("")); true } else ok
} elsefalse if (!ok) data.root.add(Tree_View.Node(""))
data
}
}
class Isabelle_Sidekick_Structure(
name: String,
node_name: Buffer => Option[Document.Node.Name],
parse: (Outer_Syntax, Document.Node.Name, CharSequence) => List[Document_Structure.Document]
) extends Isabelle_Sidekick(name) { overridedef parser(buffer: Buffer, syntax: Outer_Syntax, data: SideKickParsedData): Boolean = { def make_tree(
parent: Tree_View.Node,
offset: Text.Offset,
documents: List[Document_Structure.Document]
): Unit = {
documents.foldLeft(offset) { case (i, document) =>
document match { case Document_Structure.Block(name, text, body) => val range = Text.Range(i, i + document.length) val node =
Tree_View.Node( new Isabelle_Sidekick.Keyword_Asset(name, Library.first_line(text), range))
parent.add(node)
make_tree(node, i, body) case _ =>
}
i + document.length
}
}
node_name(buffer) match { case Some(name) =>
make_tree(data.root, 0, parse(syntax, name, JEdit_Lib.buffer_text(buffer))) true case None => false
}
}
}
class Isabelle_Sidekick_Default extends
Isabelle_Sidekick_Structure("isabelle",
PIDE.resources.theory_node_name, Document_Structure.parse_sections)
class Isabelle_Sidekick_Context extends
Isabelle_Sidekick_Structure("isabelle-context",
PIDE.resources.theory_node_name, Document_Structure.parse_blocks)
class Isabelle_Sidekick_Options extends
Isabelle_Sidekick_Structure("isabelle-options",
_ => Some(Document.Node.Name("options")), Document_Structure.parse_sections)
class Isabelle_Sidekick_Root extends
Isabelle_Sidekick_Structure("isabelle-root",
_ => Some(Document.Node.Name("ROOT")), Document_Structure.parse_sections)
overridedef parser(buffer: Buffer, syntax: Outer_Syntax, data: SideKickParsedData): Boolean = { var offset = 0 var end_offset = 0
var start1: Option[(Int, String, Vector[Tree_View.Node])] = None var start2: Option[(Int, String)] = None
def close1(): Unit =
start1 match { case Some((start_offset, s, body)) => val node = make_node(s, start_offset, end_offset)
body.foreach(node.add(_))
data.root.add(node)
start1 = None case None =>
}
def close2(): Unit =
start2 match { case Some((start_offset, s)) =>
start1 match { case Some((start_offset1, s1, body)) => val node = make_node(s, start_offset, end_offset)
start1 = Some((start_offset1, s1, body :+ node)) case None =>
}
start2 = None case None =>
}
for (line <- split_lines(JEdit_Lib.buffer_text(buffer)) if !stopped) {
line match { case Heading1(s) => close2(); close1(); start1 = Some((offset, s, Vector())) case Heading2(s) => close2(); start2 = Some((offset, s)) case _ =>
}
offset += line.length + 1 if (!line.forall(Character.isSpaceChar)) end_offset = offset
} if (!stopped) { close2(); close1() }
true
}
}
class Isabelle_Sidekick_Bibtex extends SideKickParser("bibtex") { overridedef supportsCompletion = false
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.