src/Pure/Thy/latex.scala
author wenzelm
Fri, 08 Dec 2017 23:43:58 +0100
changeset 67172 97d199699a6b
child 67173 e746db6db903
permissions -rw-r--r--
some support for LaTeX;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67172
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Thy/latex.scala
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     3
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     4
Support for LaTeX.
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     5
*/
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     6
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     7
package isabelle
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     8
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
     9
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    10
import scala.annotation.tailrec
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    11
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    12
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    13
object Latex
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    14
{
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    15
  sealed case class Error(file: Option[Path], line: Int, message: String)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    16
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    17
  def filter_errors(dir: Path, text: String): List[Error] =
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    18
  {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    19
    object File_Line_Error
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    20
    {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    21
      val Pattern = """^(.*):(\d+): (.*)$""".r
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    22
      def unapply(line: String): Option[Error] =
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    23
        line match {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    24
          case Pattern(file, Value.Int(line), message) =>
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    25
            val path = File.standard_path(file)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    26
            if (Path.is_wellformed(path)) {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    27
              val file = Path.explode(path)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    28
              if ((dir + file).is_file) Some(Error(Some(file), line, message)) else None
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    29
            }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    30
            else None
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    31
          case _ => None
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    32
        }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    33
    }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    34
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    35
    object Line_Error
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    36
    {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    37
      val Pattern = """^l\.(\d+) (.*)$""".r
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    38
      def unapply(line: String): Option[Error] =
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    39
        line match {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    40
          case Pattern(Value.Int(line), message) => Some(Error(None, line, message))
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    41
          case _ => None
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    42
        }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    43
    }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    44
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    45
    @tailrec def filter(lines: List[String], result: List[Error]): List[Error] =
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    46
      lines match {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    47
        case File_Line_Error(err1) :: rest1 =>
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    48
          rest1 match {
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    49
            case Line_Error(err2) :: rest2 if err1.line == err2.line =>
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    50
              val err = err1.copy(message = Exn.cat_message(err1.message, err2.message))
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    51
              filter(rest2, err :: result)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    52
            case _ => filter(rest1, err1 :: result)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    53
          }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    54
        case _ :: rest => filter(rest, result)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    55
        case Nil => result.reverse
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    56
      }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    57
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    58
    filter(split_lines(text), Nil)
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    59
  }
97d199699a6b some support for LaTeX;
wenzelm
parents:
diff changeset
    60
}