src/Pure/System/isabelle_fonts.scala
author wenzelm
Wed, 28 Nov 2018 14:51:24 +0100
changeset 69363 0675481ce575
parent 69360 dc9a39c3f75d
child 69364 91dbade9a5fa
permissions -rw-r--r--
clarified order;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/isabelle_system.scala
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     3
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     4
Fonts from the Isabelle system environment, notably the "Isabelle DejaVu"
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     5
collection.
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     6
*/
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     7
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     8
package isabelle
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     9
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    10
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    11
import java.awt.Font
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    12
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    13
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    14
object Isabelle_Fonts
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    15
{
69357
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    16
  /* standard names */
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    17
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    18
  val mono: String = "Isabelle DejaVu Sans Mono"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    19
  val sans: String = "Isabelle DejaVu Sans"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    20
  val serif: String = "Isabelle DejaVu Serif"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    21
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    22
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    23
  /* environment entries */
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    24
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    25
  object Entry
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    26
  {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    27
    object Ordering extends scala.math.Ordering[Entry]
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    28
    {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    29
      def compare(entry1: Entry, entry2: Entry): Int =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    30
        entry1.family compare entry2.family match {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    31
          case 0 => entry1.style compare entry2.style
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    32
          case ord => ord
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    33
        }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    34
    }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    35
  }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    36
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    37
  sealed case class Entry(path: Path, html: Boolean = false)
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    38
  {
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    39
    def bytes: Bytes = Bytes.read(path)
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    40
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    41
    lazy val font: Font = Font.createFont(Font.TRUETYPE_FONT, path.file)
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    42
    def family: String = font.getFamily
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    43
    def name: String = font.getFontName
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    44
    def style: Int =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    45
      (if (is_bold) Font.BOLD else 0) +
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    46
      (if (is_italic) Font.ITALIC else 0)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    47
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    48
    // educated guess for style: Font.createFont always produces Font.PLAIN
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    49
    private lazy val name_lowercase = Word.lowercase(name)
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    50
    def is_bold: Boolean =
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    51
      name_lowercase.containsSlice("bold")
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    52
    def is_italic: Boolean =
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    53
      name_lowercase.containsSlice("italic") ||
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    54
      name_lowercase.containsSlice("oblique")
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    55
  }
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    56
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    57
  def make_entries(
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    58
    getenv: String => String = Isabelle_System.getenv_strict(_),
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    59
    html: Boolean = false): List[Entry] =
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    60
  {
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    61
    Path.split(getenv("ISABELLE_FONTS")).map(Entry(_)) :::
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    62
    (if (html) Path.split(getenv("ISABELLE_FONTS_HTML")).map(Entry(_, html = true)) else Nil)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    63
  }
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    64
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    65
  private lazy val all_fonts: List[Entry] =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    66
    make_entries(html = true).sorted(Entry.Ordering)
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    67
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    68
  def fonts(html: Boolean = false): List[Entry] =
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    69
    if (html) all_fonts else all_fonts.filter(entry => !entry.html)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    70
}