| author | wenzelm | 
| Tue, 16 Apr 2024 16:53:10 +0200 | |
| changeset 80121 | 05cec0a3c63d | 
| parent 76355 | 16816ee9a570 | 
| child 82142 | 508a673c87ac | 
| permissions | -rw-r--r-- | 
| 43282 
5d294220ca43
moved sources -- eliminated Netbeans artifact of jedit package directory;
 wenzelm parents: 
37175diff
changeset | 1 | /* Title: Tools/jEdit/src/isabelle_encoding.scala | 
| 36760 | 2 | Author: Makarius | 
| 3 | ||
| 4 | Isabelle encoding -- based on UTF-8. | |
| 5 | */ | |
| 34619 | 6 | |
| 7 | package isabelle.jedit | |
| 8 | ||
| 34760 | 9 | |
| 36015 | 10 | import isabelle._ | 
| 11 | ||
| 34625 
799a40faa4f1
completion: decode symbols only if isabelle encoding is active (to prevent unicode chars written back to file);
 wenzelm parents: 
34624diff
changeset | 12 | import org.gjt.sp.jedit.buffer.JEditBuffer | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 13 | import org.gjt.sp.jedit.io.Encoding | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 14 | |
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 15 | import java.nio.charset.{Charset, CodingErrorAction, CharacterCodingException}
 | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 16 | import java.io.{InputStream, OutputStream, Reader, Writer, InputStreamReader, OutputStreamWriter,
 | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 17 | CharArrayReader, ByteArrayOutputStream} | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 18 | |
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 19 | import scala.io.{Codec, BufferedSource}
 | 
| 34619 | 20 | |
| 21 | ||
| 75393 | 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: 
34624diff
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: 
62527diff
changeset | 24 | buffer.getStringProperty(JEditBuffer.ENCODING).asInstanceOf[String] == "UTF-8-Isabelle" | 
| 62104 
fb73c0d7bb37
clarified symbol insertion, depending on buffer encoding;
 wenzelm parents: 
50203diff
changeset | 25 | |
| 67130 | 26 | def perhaps_decode(buffer: JEditBuffer, s: String): String = | 
| 62104 
fb73c0d7bb37
clarified symbol insertion, depending on buffer encoding;
 wenzelm parents: 
50203diff
changeset | 27 | if (is_active(buffer)) Symbol.decode(s) else s | 
| 34624 | 28 | } | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 29 | |
| 75393 | 30 | class Isabelle_Encoding extends Encoding {
 | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 31 | private val BUFSIZE = 32768 | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 32 | |
| 75393 | 33 |   private def text_reader(in: InputStream, codec: Codec, strict: Boolean): Reader = {
 | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 34 | val source = (new BufferedSource(in)(codec)).mkString | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 35 | |
| 75197 | 36 | if (strict && Codepoint.iterator(source).exists(Symbol.symbols.code_defined)) | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 37 | throw new CharacterCodingException() | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 38 | |
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 39 | new CharArrayReader(Symbol.decode(source).toArray) | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 40 | } | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 41 | |
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 42 | override def getTextReader(in: InputStream): Reader = | 
| 76355 | 43 | text_reader(in, Codec(UTF8.charset), true) | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 44 | |
| 75393 | 45 |   override def getPermissiveTextReader(in: InputStream): Reader = {
 | 
| 76355 | 46 | val codec = Codec(UTF8.charset) | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 47 | codec.onMalformedInput(CodingErrorAction.REPLACE) | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 48 | codec.onUnmappableCharacter(CodingErrorAction.REPLACE) | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 49 | text_reader(in, codec, false) | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 50 | } | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 51 | |
| 75393 | 52 |   override def getTextWriter(out: OutputStream): Writer = {
 | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 53 |     val buffer = new ByteArrayOutputStream(BUFSIZE) {
 | 
| 75393 | 54 |       override def flush(): Unit = {
 | 
| 76354 | 55 | val text = Symbol.encode(toString(UTF8.charset)) | 
| 73987 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 56 | out.write(UTF8.bytes(text)) | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 57 | out.flush() | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 58 | } | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 59 | override def close(): Unit = out.close() | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 60 | } | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 61 | new OutputStreamWriter(buffer, UTF8.charset.newEncoder()) | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 62 | } | 
| 
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
 wenzelm parents: 
67130diff
changeset | 63 | } |