src/Tools/jEdit/src/isabelle_encoding.scala
author wenzelm
Thu, 07 Jul 2011 13:48:30 +0200
changeset 44569 5130dfe1b7be
parent 44532 39fdbd814c7f
child 49292 f14e564fca1a
permissions -rw-r--r--
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
tuned implicit build/init messages;
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
}