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