isabelle-hacks/fxp/src/Apps/Canon/canonOutput.sml

76 lines
2.4 KiB
Standard ML

signature CanonOutput =
sig
type Dtd
val printError : Errors.Position * Errors.Error -> unit
val printWarning : Errors.Position * Errors.Warning -> unit
val putProcInst : CanonEncode.File * HookData.ProcInstInfo -> CanonEncode.File
val putStartTag : Dtd -> CanonEncode.File * HookData.StartTagInfo -> CanonEncode.File
val putEndTag : Dtd -> CanonEncode.File * HookData.EndTagInfo -> CanonEncode.File
end
functor CanonOutput (structure ParserOptions : ParserOptions) : CanonOutput =
struct
open
Base UniChar DfaData Dtd Errors ParserOptions
CanonEncode CanonOptions HookData
fun printError(pos,err) = if !O_SILENT then () else TextIO.output
(!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH)
(Position2String pos
::(if isFatalError err then "Fatal error:" else "Error:")
::errorMessage err))
fun printWarning(pos,warn) = if !O_SILENT then () else TextIO.output
(!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH)
(Position2String pos^" Warning:"::warningMessage warn))
fun putAttValue (f,cv) =
let
val f1 = putChar(f,0wx22)
val f2 = putDataVector(f1,cv)
val f3 = putChar(f2,0wx22)
in f3
end
fun putAttSpec(f,(att,cv)) =
let
val f1 = putBlank f
val f2 = putData(f1,att)
val f3 = putChar(f2,0wx3D)
val f4 = putAttValue(f3,cv)
in f4
end
fun putEndTag dtd (f,(_,eidx,_)) =
let
val f1 = putData(f,[0wx3C,0wx2F]) (* "</" *)
val f2 = putData(f1,Index2Element dtd eidx)
in putChar(f2,0wx3E) (* #">" *)
end
fun putStartTag dtd (f,(pp,eidx,atts,_,mt)) =
let
val f1 = putChar(f,0wx3C) (* #"<" *)
val f2 = putData(f1,Index2Element dtd eidx)
val atts1 = List.mapPartial
(fn (aidx,ap,_) =>
case ap
of AP_PRESENT(_,cv,_) => SOME(Index2AttNot dtd aidx,cv)
| AP_DEFAULT(_,cv,_) => SOME(Index2AttNot dtd aidx,cv)
| _ => NONE) atts
val atts2 = UtilList.sort (fn ((a1,_),(a2,_)) => compareData (a1,a2)) atts1
val f3 = foldl (fn (spec,f) => putAttSpec (f,spec)) f2 atts2
val f4 = putChar(f3,0wx3E) (* #">" *)
in if mt then putEndTag dtd (f4,(pp,eidx,NONE)) else f4
end
fun putProcInst(f,(_,target,_,text)) =
let
val f1 = putData(f,[0wx3c,0wx3f])
val f2 = putData(f1,target)
val f3 = putBlank f2
val f4 = putVector(f3 ,text)
in putData(f3,[0wx3f,0wx3e])
end
end