src/Pure/Isar/document_structure.scala
author wenzelm
Thu, 11 Aug 2016 15:32:53 +0200
changeset 63666 ff6caffcaed4
parent 63610 4b40b8196dc7
child 64610 1b89608974e9
permissions -rw-r--r--
suppress ASCII art;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Isar/document_structure.scala
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     3
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     4
Overall document structure.
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     5
*/
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     6
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     8
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
     9
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    10
import scala.collection.mutable
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    11
import scala.annotation.tailrec
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    12
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    13
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    14
object Document_Structure
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    15
{
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    16
  /** general structure **/
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    17
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    18
  sealed abstract class Document { def length: Int }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    19
  case class Block(name: String, text: String, body: List[Document]) extends Document
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    20
  { val length: Int = (0 /: body)(_ + _.length) }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    21
  case class Atom(length: Int) extends Document
63605
wenzelm
parents: 63604
diff changeset
    22
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    23
  private def is_theory_command(keywords: Keyword.Keywords, name: String): Boolean =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    24
    keywords.kinds.get(name) match {
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    25
      case Some(kind) => Keyword.theory(kind) && !Keyword.theory_end(kind)
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    26
      case None => false
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    27
    }
63605
wenzelm
parents: 63604
diff changeset
    28
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    29
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    30
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    31
  /** context blocks **/
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    32
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    33
  def parse_blocks(
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    34
    syntax: Outer_Syntax,
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    35
    node_name: Document.Node.Name,
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    36
    text: CharSequence): List[Document] =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    37
  {
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    38
    def is_plain_theory(command: Command): Boolean =
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    39
      is_theory_command(syntax.keywords, command.span.name) &&
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    40
      !command.span.is_begin && !command.span.is_end
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    41
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    42
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    43
    /* stack operations */
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    44
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    45
    def buffer(): mutable.ListBuffer[Document] = new mutable.ListBuffer[Document]
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    46
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    47
    var stack: List[(Command, mutable.ListBuffer[Document])] =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    48
      List((Command.empty, buffer()))
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    49
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    50
    def open(command: Command) { stack = (command, buffer()) :: stack }
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    51
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    52
    def close(): Boolean =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    53
      stack match {
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    54
        case (command, body) :: (_, body2) :: _ =>
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    55
          body2 += Block(command.span.name, command.source, body.toList)
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    56
          stack = stack.tail
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    57
          true
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    58
        case _ =>
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    59
          false
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    60
      }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    61
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    62
    def flush() { if (is_plain_theory(stack.head._1)) close() }
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    63
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    64
    def result(): List[Document] =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    65
    {
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    66
      while (close()) { }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    67
      stack.head._2.toList
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    68
    }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    69
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    70
    def add(command: Command)
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    71
    {
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    72
      if (command.span.is_begin || is_plain_theory(command)) { flush(); open(command) }
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    73
      else if (command.span.is_end) { flush(); close() }
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    74
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    75
      stack.head._2 += Atom(command.source.length)
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    76
    }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    77
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    78
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    79
    /* result structure */
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    80
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    81
    val spans = syntax.parse_spans(text)
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    82
    spans.foreach(span => add(Command(Document_ID.none, node_name, Command.no_blobs, span)))
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    83
    result()
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    84
  }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    85
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    86
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    87
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    88
  /** section headings **/
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    89
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    90
  trait Item
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    91
  {
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    92
    def name: String = ""
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    93
    def source: String = ""
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    94
    def heading_level: Option[Int] = None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    95
  }
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    96
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    97
  object No_Item extends Item
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    98
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    99
  class Sections(keywords: Keyword.Keywords)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   100
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   101
    private def buffer(): mutable.ListBuffer[Document] = new mutable.ListBuffer[Document]
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   102
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   103
    private var stack: List[(Int, Item, mutable.ListBuffer[Document])] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   104
      List((0, No_Item, buffer()))
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   105
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   106
    @tailrec private def close(level: Int => Boolean)
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   107
    {
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   108
      stack match {
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   109
        case (lev, item, body) :: (_, _, body2) :: _ if level(lev) =>
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   110
          body2 += Block(item.name, item.source, body.toList)
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   111
          stack = stack.tail
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   112
          close(level)
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   113
        case _ =>
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   114
      }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   115
    }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   116
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   117
    def result(): List[Document] =
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   118
    {
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   119
      close(_ => true)
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   120
      stack.head._3.toList
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   121
    }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   122
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   123
    def add(item: Item)
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   124
    {
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   125
      item.heading_level match {
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   126
        case Some(i) =>
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   127
          close(_ > i)
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   128
          stack = (i + 1, item, buffer()) :: stack
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   129
        case None =>
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   130
      }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   131
      stack.head._3 += Atom(item.source.length)
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   132
    }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   133
  }
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   134
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   135
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   136
  /* outer syntax sections */
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   137
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   138
  private class Command_Item(keywords: Keyword.Keywords, command: Command) extends Item
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   139
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   140
    override def name: String = command.span.name
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   141
    override def source: String = command.source
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   142
    override def heading_level: Option[Int] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   143
    {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   144
      name match {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   145
        case Thy_Header.CHAPTER => Some(0)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   146
        case Thy_Header.SECTION => Some(1)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   147
        case Thy_Header.SUBSECTION => Some(2)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   148
        case Thy_Header.SUBSUBSECTION => Some(3)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   149
        case Thy_Header.PARAGRAPH => Some(4)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   150
        case Thy_Header.SUBPARAGRAPH => Some(5)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   151
        case _ if is_theory_command(keywords, name) => Some(6)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   152
        case _ => None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   153
      }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   154
    }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   155
  }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   156
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   157
  def parse_sections(
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   158
    syntax: Outer_Syntax,
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   159
    node_name: Document.Node.Name,
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   160
    text: CharSequence): List[Document] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   161
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   162
    val sections = new Sections(syntax.keywords)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   163
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   164
    for { span <- syntax.parse_spans(text) } {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   165
      sections.add(
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   166
        new Command_Item(syntax.keywords,
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   167
          Command(Document_ID.none, node_name, Command.no_blobs, span)))
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   168
    }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   169
    sections.result()
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   170
  }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   171
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   172
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   173
  /* ML sections */
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   174
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   175
  private class ML_Item(token: ML_Lex.Token, level: Option[Int]) extends Item
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   176
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   177
    override def source: String = token.source
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   178
    override def heading_level: Option[Int] = level
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   179
  }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   180
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   181
  def parse_ml_sections(SML: Boolean, text: CharSequence): List[Document] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   182
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   183
    val sections = new Sections(Keyword.Keywords.empty)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   184
    val nl = new ML_Item(ML_Lex.Token(ML_Lex.Kind.SPACE, "\n"), None)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   185
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   186
    var context: Scan.Line_Context = Scan.Finished
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   187
    for (line <- Library.separated_chunks(_ == '\n', text)) {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   188
      val (toks, next_context) = ML_Lex.tokenize_line(SML, line, context)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   189
      val level =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   190
        toks.filterNot(_.is_space) match {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   191
          case List(tok) if tok.is_comment =>
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   192
            val s = tok.source
63666
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   193
            if (Word.codepoint_iterator(s).exists(c =>
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   194
                  Character.isLetter(c) || Character.isDigit(c)))
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   195
            {
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   196
              if (s.startsWith("(**** ") && s.endsWith(" ****)")) Some(0)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   197
              else if (s.startsWith("(*** ") && s.endsWith(" ***)")) Some(1)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   198
              else if (s.startsWith("(** ") && s.endsWith(" **)")) Some(2)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   199
              else if (s.startsWith("(* ") && s.endsWith(" *)")) Some(3)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   200
              else None
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   201
            }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   202
            else None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   203
          case _ => None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   204
        }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   205
      if (level.isDefined && context == Scan.Finished && next_context == Scan.Finished)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   206
        toks.foreach(tok => sections.add(new ML_Item(tok, if (tok.is_comment) level else None)))
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   207
      else
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   208
        toks.foreach(tok => sections.add(new ML_Item(tok, None)))
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   209
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   210
      sections.add(nl)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   211
      context = next_context
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   212
    }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   213
    sections.result()
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   214
  }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   215
}