src/Tools/jEdit/src/jedit/IsabelleEncoding.scala
author wenzelm
Fri, 26 Jun 2009 18:22:40 +0200
changeset 34621 6cba4b3723e4
parent 34620 5328c64f9866
child 34624 5e4f33d033ba
permissions -rw-r--r--
more precise wrapping of I/O streams;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     1
/*
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     2
 * Isabelle encoding -- based on utf-8
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     3
 *
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     4
 * @author Makarius
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     5
 */
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
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
     9
import org.gjt.sp.jedit.io.Encoding
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    10
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    11
import java.nio.charset.{Charset, CharsetDecoder, CodingErrorAction}
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    12
import java.io.{InputStream, OutputStream, Reader, Writer, InputStreamReader, OutputStreamWriter,
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    13
  CharArrayReader, ByteArrayOutputStream}
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    14
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    15
import scala.io.{Source, BufferedSource}
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    16
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    17
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    18
class IsabelleEncoding extends Encoding
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    19
{
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    20
  private val charset = Charset.forName(Isabelle_System.charset)
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    21
  private val BUFSIZE = 32768
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    22
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    23
  private def text_reader(in: InputStream, decoder: CharsetDecoder): Reader =
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    24
  {
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    25
    def source(): Source =
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    26
      BufferedSource.fromInputStream(in, decoder, BUFSIZE, { () => source() })
34621
6cba4b3723e4 more precise wrapping of I/O streams;
wenzelm
parents: 34620
diff changeset
    27
    new CharArrayReader(Isabelle.symbols.decode(source.mkString).toArray)
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    28
  }
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    29
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    30
	override def getTextReader(in: InputStream): Reader =
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    31
    text_reader(in, charset.newDecoder())
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    32
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    33
	override def getPermissiveTextReader(in: InputStream): Reader =
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    34
	{
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    35
		val decoder = charset.newDecoder()
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    36
		decoder.onMalformedInput(CodingErrorAction.REPLACE)
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    37
		decoder.onUnmappableCharacter(CodingErrorAction.REPLACE)
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    38
		text_reader(in, decoder)
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    39
	}
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    40
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    41
  override def getTextWriter(out: OutputStream): Writer =
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    42
  {
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    43
    val buffer = new ByteArrayOutputStream(BUFSIZE) {
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    44
      override def flush()
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    45
      {
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    46
        val text = Isabelle.symbols.encode(toString(Isabelle_System.charset))
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    47
        out.write(text.getBytes(Isabelle_System.charset))
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    48
        out.flush()
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    49
      }
34621
6cba4b3723e4 more precise wrapping of I/O streams;
wenzelm
parents: 34620
diff changeset
    50
      override def close() { out.close() }
34620
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    51
    }
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    52
		new OutputStreamWriter(buffer, charset.newEncoder())
5328c64f9866 some support for actual symbol recoding;
wenzelm
parents: 34619
diff changeset
    53
  }
34619
e89b6ec97910 added IsabelleEncoding -- a clone of utf-8 for now;
wenzelm
parents:
diff changeset
    54
}