wenzelm@44162
|
1 |
/* Title: Tools/jEdit/src/isabelle_encoding.scala
|
wenzelm@36760
|
2 |
Author: Makarius
|
wenzelm@36760
|
3 |
|
wenzelm@36760
|
4 |
Isabelle encoding -- based on UTF-8.
|
wenzelm@36760
|
5 |
*/
|
wenzelm@34622
|
6 |
|
wenzelm@34622
|
7 |
package isabelle.jedit
|
wenzelm@34622
|
8 |
|
wenzelm@34763
|
9 |
|
wenzelm@36039
|
10 |
import isabelle._
|
wenzelm@36039
|
11 |
|
wenzelm@34622
|
12 |
import org.gjt.sp.jedit.io.Encoding
|
wenzelm@34628
|
13 |
import org.gjt.sp.jedit.buffer.JEditBuffer
|
wenzelm@34622
|
14 |
|
wenzelm@36039
|
15 |
import java.nio.charset.{Charset, CodingErrorAction}
|
wenzelm@34623
|
16 |
import java.io.{InputStream, OutputStream, Reader, Writer, InputStreamReader, OutputStreamWriter,
|
wenzelm@34623
|
17 |
CharArrayReader, ByteArrayOutputStream}
|
wenzelm@34623
|
18 |
|
wenzelm@36039
|
19 |
import scala.io.{Codec, Source, BufferedSource}
|
wenzelm@34622
|
20 |
|
wenzelm@34622
|
21 |
|
wenzelm@34741
|
22 |
object Isabelle_Encoding
|
wenzelm@34627
|
23 |
{
|
wenzelm@34627
|
24 |
val NAME = "UTF-8-Isabelle"
|
wenzelm@34628
|
25 |
|
wenzelm@34628
|
26 |
def is_active(buffer: JEditBuffer): Boolean =
|
wenzelm@34796
|
27 |
buffer.getStringProperty(JEditBuffer.ENCODING).asInstanceOf[String] == NAME
|
wenzelm@34627
|
28 |
}
|
wenzelm@34627
|
29 |
|
wenzelm@34741
|
30 |
class Isabelle_Encoding extends Encoding
|
wenzelm@34622
|
31 |
{
|
wenzelm@44396
|
32 |
private val BUFSIZE = 32768
|
wenzelm@34623
|
33 |
|
wenzelm@36039
|
34 |
private def text_reader(in: InputStream, codec: Codec): Reader =
|
wenzelm@34623
|
35 |
{
|
wenzelm@36039
|
36 |
val source = new BufferedSource(in)(codec)
|
wenzelm@44569
|
37 |
new CharArrayReader(Symbol.decode(source.mkString).toArray)
|
wenzelm@34623
|
38 |
}
|
wenzelm@34622
|
39 |
|
wenzelm@37176
|
40 |
override def getTextReader(in: InputStream): Reader =
|
wenzelm@36039
|
41 |
text_reader(in, Standard_System.codec())
|
wenzelm@34622
|
42 |
|
wenzelm@37176
|
43 |
override def getPermissiveTextReader(in: InputStream): Reader =
|
wenzelm@37176
|
44 |
{
|
wenzelm@37176
|
45 |
val codec = Standard_System.codec()
|
wenzelm@37176
|
46 |
codec.onMalformedInput(CodingErrorAction.REPLACE)
|
wenzelm@37176
|
47 |
codec.onUnmappableCharacter(CodingErrorAction.REPLACE)
|
wenzelm@37176
|
48 |
text_reader(in, codec)
|
wenzelm@37176
|
49 |
}
|
wenzelm@34623
|
50 |
|
wenzelm@34623
|
51 |
override def getTextWriter(out: OutputStream): Writer =
|
wenzelm@34623
|
52 |
{
|
wenzelm@34623
|
53 |
val buffer = new ByteArrayOutputStream(BUFSIZE) {
|
wenzelm@34623
|
54 |
override def flush()
|
wenzelm@34623
|
55 |
{
|
wenzelm@44569
|
56 |
val text = Symbol.encode(toString(Standard_System.charset_name))
|
wenzelm@34808
|
57 |
out.write(text.getBytes(Standard_System.charset))
|
wenzelm@34623
|
58 |
out.flush()
|
wenzelm@34623
|
59 |
}
|
wenzelm@34624
|
60 |
override def close() { out.close() }
|
wenzelm@34623
|
61 |
}
|
wenzelm@44396
|
62 |
new OutputStreamWriter(buffer, Standard_System.charset.newEncoder())
|
wenzelm@34623
|
63 |
}
|
wenzelm@34622
|
64 |
}
|