src/Tools/jEdit/src/isabelle_encoding.scala
author wenzelm
Tue, 16 Apr 2024 16:53:10 +0200
changeset 80121 05cec0a3c63d
parent 76355 16816ee9a570
child 82142 508a673c87ac
permissions -rw-r--r--
clarified modules and options (from store);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43282
5d294220ca43 moved sources -- eliminated Netbeans artifact of jedit package directory;
wenzelm
parents: 37175
diff changeset
     1
/*  Title:      Tools/jEdit/src/isabelle_encoding.scala
36760
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     2
    Author:     Makarius
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     3
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     4
Isabelle encoding -- based on UTF-8.
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     5
*/
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     6
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     8
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
     9
36015
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34805
diff changeset
    10
import isabelle._
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34805
diff changeset
    11
34625
799a40faa4f1 completion: decode symbols only if isabelle encoding is active (to prevent unicode chars written back to file);
wenzelm
parents: 34624
diff changeset
    12
import org.gjt.sp.jedit.buffer.JEditBuffer
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    13
import org.gjt.sp.jedit.io.Encoding
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    14
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    15
import java.nio.charset.{Charset, CodingErrorAction, CharacterCodingException}
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    16
import java.io.{InputStream, OutputStream, Reader, Writer, InputStreamReader, OutputStreamWriter,
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    17
  CharArrayReader, ByteArrayOutputStream}
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    18
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    19
import scala.io.{Codec, BufferedSource}
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    20
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    21
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75197
diff changeset
    22
object Isabelle_Encoding {
34625
799a40faa4f1 completion: decode symbols only if isabelle encoding is active (to prevent unicode chars written back to file);
wenzelm
parents: 34624
diff changeset
    23
  def is_active(buffer: JEditBuffer): Boolean =
66457
9098c36abd1a separate base plugin for important services that should be always available, despite startup errors of the main plugin;
wenzelm
parents: 62527
diff changeset
    24
    buffer.getStringProperty(JEditBuffer.ENCODING).asInstanceOf[String] == "UTF-8-Isabelle"
62104
fb73c0d7bb37 clarified symbol insertion, depending on buffer encoding;
wenzelm
parents: 50203
diff changeset
    25
67130
b023f64e0d16 tuned signature;
wenzelm
parents: 66457
diff changeset
    26
  def perhaps_decode(buffer: JEditBuffer, s: String): String =
62104
fb73c0d7bb37 clarified symbol insertion, depending on buffer encoding;
wenzelm
parents: 50203
diff changeset
    27
    if (is_active(buffer)) Symbol.decode(s) else s
34624
5e4f33d033ba decentralized Isabelle component names;
wenzelm
parents: 34621
diff changeset
    28
}
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    29
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75197
diff changeset
    30
class Isabelle_Encoding extends Encoding {
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    31
  private val BUFSIZE = 32768
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    32
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75197
diff changeset
    33
  private def text_reader(in: InputStream, codec: Codec, strict: Boolean): Reader = {
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    34
    val source = (new BufferedSource(in)(codec)).mkString
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    35
75197
29e11ce79a52 clarified signature;
wenzelm
parents: 75195
diff changeset
    36
    if (strict && Codepoint.iterator(source).exists(Symbol.symbols.code_defined))
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    37
      throw new CharacterCodingException()
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    38
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    39
    new CharArrayReader(Symbol.decode(source).toArray)
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    40
  }
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    41
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    42
  override def getTextReader(in: InputStream): Reader =
76355
16816ee9a570 tuned signature;
wenzelm
parents: 76354
diff changeset
    43
    text_reader(in, Codec(UTF8.charset), true)
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    44
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75197
diff changeset
    45
  override def getPermissiveTextReader(in: InputStream): Reader = {
76355
16816ee9a570 tuned signature;
wenzelm
parents: 76354
diff changeset
    46
    val codec = Codec(UTF8.charset)
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    47
    codec.onMalformedInput(CodingErrorAction.REPLACE)
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    48
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE)
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    49
    text_reader(in, codec, false)
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    50
  }
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    51
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75197
diff changeset
    52
  override def getTextWriter(out: OutputStream): Writer = {
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    53
    val buffer = new ByteArrayOutputStream(BUFSIZE) {
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75197
diff changeset
    54
      override def flush(): Unit = {
76354
908433a347d1 tuned signature;
wenzelm
parents: 75393
diff changeset
    55
        val text = Symbol.encode(toString(UTF8.charset))
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    56
        out.write(UTF8.bytes(text))
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    57
        out.flush()
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    58
      }
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    59
      override def close(): Unit = out.close()
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    60
    }
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    61
    new OutputStreamWriter(buffer, UTF8.charset.newEncoder())
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    62
  }
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 67130
diff changeset
    63
}