| author | wenzelm |
| Fri, 27 Dec 2024 17:26:51 +0100 | |
| changeset 81669 | 09c16e5636ad |
| parent 76355 | 16816ee9a570 |
| child 82142 | 508a673c87ac |
| permissions | -rw-r--r-- |
|
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 | 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:
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 | 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:
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 | 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 | 28 |
} |
|
73987
fc363a3b690a
build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents:
67130
diff
changeset
|
29 |
|
| 75393 | 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 | 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 | 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 | 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 | 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:
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 | 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 | 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:
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 |
} |