src/Pure/Isar/document_structure.scala
author wenzelm
Mon, 01 Mar 2021 22:22:12 +0100
changeset 73340 0ffcad1f6130
parent 72814 51eec6d51882
child 73359 d8a0e996614b
permissions -rw-r--r--
tuned --- fewer warnings;
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
69859
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    23
  def is_theory_command(keywords: Keyword.Keywords, command: Command): Boolean =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents: 68840
diff changeset
    24
    command.span.is_kind(keywords,
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents: 68840
diff changeset
    25
      kind => Keyword.theory(kind) && !Keyword.theory_end(kind), false)
63605
wenzelm
parents: 63604
diff changeset
    26
70148
73a34cb9e67e tuned signature: more operations;
wenzelm
parents: 69869
diff changeset
    27
  def is_document_command(keywords: Keyword.Keywords, command: Command): Boolean =
73a34cb9e67e tuned signature: more operations;
wenzelm
parents: 69869
diff changeset
    28
    command.span.is_kind(keywords, Keyword.document, false)
73a34cb9e67e tuned signature: more operations;
wenzelm
parents: 69869
diff changeset
    29
71165
03afc8252225 support for output messages;
wenzelm
parents: 70148
diff changeset
    30
  def is_diag_command(keywords: Keyword.Keywords, command: Command): Boolean =
03afc8252225 support for output messages;
wenzelm
parents: 70148
diff changeset
    31
    command.span.is_kind(keywords, Keyword.diag, false)
03afc8252225 support for output messages;
wenzelm
parents: 70148
diff changeset
    32
69869
f2c3512df446 tuned signature;
wenzelm
parents: 69860
diff changeset
    33
  def is_heading_command(command: Command): Boolean =
f2c3512df446 tuned signature;
wenzelm
parents: 69860
diff changeset
    34
    proper_heading_level(command).isDefined
f2c3512df446 tuned signature;
wenzelm
parents: 69860
diff changeset
    35
69860
b58a575d211e tuned signature;
wenzelm
parents: 69859
diff changeset
    36
  def proper_heading_level(command: Command): Option[Int] =
69859
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    37
    command.span.name match {
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    38
      case Thy_Header.CHAPTER => Some(0)
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    39
      case Thy_Header.SECTION => Some(1)
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    40
      case Thy_Header.SUBSECTION => Some(2)
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    41
      case Thy_Header.SUBSUBSECTION => Some(3)
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    42
      case Thy_Header.PARAGRAPH => Some(4)
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    43
      case Thy_Header.SUBPARAGRAPH => Some(5)
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    44
      case _ => None
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    45
    }
69860
b58a575d211e tuned signature;
wenzelm
parents: 69859
diff changeset
    46
b58a575d211e tuned signature;
wenzelm
parents: 69859
diff changeset
    47
  def heading_level(keywords: Keyword.Keywords, command: Command): Option[Int] =
b58a575d211e tuned signature;
wenzelm
parents: 69859
diff changeset
    48
    proper_heading_level(command) orElse
b58a575d211e tuned signature;
wenzelm
parents: 69859
diff changeset
    49
      (if (is_theory_command(keywords, command)) Some(6) else None)
69859
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
    50
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
    51
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    52
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    53
  /** context blocks **/
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    54
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    55
  def parse_blocks(
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    56
    syntax: Outer_Syntax,
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    57
    node_name: Document.Node.Name,
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    58
    text: CharSequence): List[Document] =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    59
  {
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    60
    def is_plain_theory(command: Command): Boolean =
68840
51ab4c78235b tuned signature;
wenzelm
parents: 64610
diff changeset
    61
      is_theory_command(syntax.keywords, command) &&
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    62
      !command.span.is_begin && !command.span.is_end
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    63
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    64
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    65
    /* stack operations */
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    66
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    67
    def buffer(): mutable.ListBuffer[Document] = new mutable.ListBuffer[Document]
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
    var stack: List[(Command, mutable.ListBuffer[Document])] =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    70
      List((Command.empty, buffer()))
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    71
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 72814
diff changeset
    72
    def open(command: Command): Unit = { stack = (command, buffer()) :: stack }
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    73
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    74
    def close(): Boolean =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    75
      stack match {
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    76
        case (command, body) :: (_, body2) :: _ =>
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    77
          body2 += Block(command.span.name, command.source, body.toList)
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    78
          stack = stack.tail
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    79
          true
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    80
        case _ =>
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    81
          false
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    82
      }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    83
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 72814
diff changeset
    84
    def flush(): Unit = if (is_plain_theory(stack.head._1)) close()
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    85
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    86
    def result(): List[Document] =
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    87
    {
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    88
      while (close()) { }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    89
      stack.head._2.toList
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    90
    }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    91
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 72814
diff changeset
    92
    def add(command: Command): Unit =
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    93
    {
63607
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    94
      if (command.span.is_begin || is_plain_theory(command)) { flush(); open(command) }
7246254d558f clarified handling of plain theory commands;
wenzelm
parents: 63606
diff changeset
    95
      else if (command.span.is_end) { flush(); close() }
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    96
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
    97
      stack.head._2 += Atom(command.source.length)
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    98
    }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
    99
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   100
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   101
    /* result structure */
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   102
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   103
    val spans = syntax.parse_spans(text)
72814
51eec6d51882 clarified signature --- more explicit types;
wenzelm
parents: 71165
diff changeset
   104
    spans.foreach(span => add(Command(Document_ID.none, node_name, Command.Blobs_Info.none, span)))
63606
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   105
    result()
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   106
  }
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   107
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   108
fc3a23763617 support for context block structure in Sidekick;
wenzelm
parents: 63605
diff changeset
   109
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   110
  /** section headings **/
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   111
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   112
  trait Item
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   113
  {
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   114
    def name: String = ""
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   115
    def source: String = ""
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   116
    def heading_level: Option[Int] = None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   117
  }
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   118
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   119
  object No_Item extends Item
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   120
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   121
  class Sections(keywords: Keyword.Keywords)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   122
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   123
    private def buffer(): mutable.ListBuffer[Document] = new mutable.ListBuffer[Document]
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
    private var stack: List[(Int, Item, mutable.ListBuffer[Document])] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   126
      List((0, No_Item, buffer()))
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   127
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 72814
diff changeset
   128
    @tailrec private def close(level: Int => Boolean): Unit =
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   129
    {
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   130
      stack match {
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   131
        case (lev, item, body) :: (_, _, body2) :: _ if level(lev) =>
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   132
          body2 += Block(item.name, item.source, body.toList)
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   133
          stack = stack.tail
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   134
          close(level)
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   135
        case _ =>
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   136
      }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   137
    }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   138
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   139
    def result(): List[Document] =
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   140
    {
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   141
      close(_ => true)
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   142
      stack.head._3.toList
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   143
    }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   144
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 72814
diff changeset
   145
    def add(item: Item): Unit =
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   146
    {
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   147
      item.heading_level match {
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   148
        case Some(i) =>
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   149
          close(_ > i)
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   150
          stack = (i + 1, item, buffer()) :: stack
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   151
        case None =>
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   152
      }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   153
      stack.head._3 += Atom(item.source.length)
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   154
    }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   155
  }
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   156
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   157
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   158
  /* outer syntax sections */
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   159
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   160
  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
   161
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   162
    override def name: String = command.span.name
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   163
    override def source: String = command.source
69859
e18ba60a1cf8 clarified signature -- allow more re-use;
wenzelm
parents: 68845
diff changeset
   164
    override def heading_level: Option[Int] = Document_Structure.heading_level(keywords, command)
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   165
  }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   166
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   167
  def parse_sections(
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   168
    syntax: Outer_Syntax,
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   169
    node_name: Document.Node.Name,
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   170
    text: CharSequence): List[Document] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   171
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   172
    val sections = new Sections(syntax.keywords)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   173
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   174
    for { span <- syntax.parse_spans(text) } {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   175
      sections.add(
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   176
        new Command_Item(syntax.keywords,
72814
51eec6d51882 clarified signature --- more explicit types;
wenzelm
parents: 71165
diff changeset
   177
          Command(Document_ID.none, node_name, Command.Blobs_Info.none, span)))
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   178
    }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   179
    sections.result()
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
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   182
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   183
  /* ML sections */
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   184
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   185
  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
   186
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   187
    override def source: String = token.source
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   188
    override def heading_level: Option[Int] = level
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   189
  }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   190
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   191
  def parse_ml_sections(SML: Boolean, text: CharSequence): List[Document] =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   192
  {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   193
    val sections = new Sections(Keyword.Keywords.empty)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   194
    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
   195
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   196
    var context: Scan.Line_Context = Scan.Finished
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   197
    for (line <- Library.separated_chunks(_ == '\n', text)) {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   198
      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
   199
      val level =
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   200
        toks.filterNot(_.is_space) match {
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   201
          case List(tok) if tok.is_comment =>
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   202
            val s = tok.source
64610
1b89608974e9 clarified modules;
wenzelm
parents: 63666
diff changeset
   203
            if (Codepoint.iterator(s).exists(c => Character.isLetter(c) || Character.isDigit(c)))
63666
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   204
            {
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   205
              if (s.startsWith("(**** ") && s.endsWith(" ****)")) Some(0)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   206
              else if (s.startsWith("(*** ") && s.endsWith(" ***)")) Some(1)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   207
              else if (s.startsWith("(** ") && s.endsWith(" **)")) Some(2)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   208
              else if (s.startsWith("(* ") && s.endsWith(" *)")) Some(3)
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   209
              else None
ff6caffcaed4 suppress ASCII art;
wenzelm
parents: 63610
diff changeset
   210
            }
63610
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   211
            else None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   212
          case _ => None
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   213
        }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   214
      if (level.isDefined && context == Scan.Finished && next_context == Scan.Finished)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   215
        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
   216
      else
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   217
        toks.foreach(tok => sections.add(new ML_Item(tok, None)))
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   218
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   219
      sections.add(nl)
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   220
      context = next_context
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   221
    }
4b40b8196dc7 Sidekick parser for isabelle-ml and sml mode;
wenzelm
parents: 63607
diff changeset
   222
    sections.result()
63604
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   223
  }
d8de4f8b95eb clarified modules;
wenzelm
parents:
diff changeset
   224
}