
io.kaitai.struct.HtmlClassCompiler.scala Maven / Gradle / Ivy
package io.kaitai.struct
import io.kaitai.struct.datatype.DataType
import io.kaitai.struct.datatype.DataType.UserType
import io.kaitai.struct.exprlang.Ast
import io.kaitai.struct.format._
import io.kaitai.struct.languages.components.{LanguageCompiler, LanguageCompilerStatic}
class HtmlClassCompiler(classSpecs: ClassSpecs, topClass: ClassSpec) extends DocClassCompiler(classSpecs, topClass) {
import HtmlClassCompiler._
override def outFileName(topClass: ClassSpec): String = s"${topClass.nameAsStr}.html"
override def indent: String = ""
override def fileHeader(topClass: ClassSpec): Unit = {
out.puts(
s"""
|
|
|
|
|
|
|
|
|
|
| ${type2str(topClass.name.last)} format specification
|
|
| ${type2str(topClass.name.last)} format specification
|
""".stripMargin)
// TODO: parse & output meta/title, meta/file-extensions, etc
}
override def fileFooter(topClass: ClassSpec): Unit = {
out.puts(
"""
|
|
|
|
|
|
|
|
""".stripMargin)
}
override def classHeader(classSpec: ClassSpec): Unit = {
out.puts(s"")
out.puts(s"<$headerByIndent>Type: ${type2str(classSpec.name.last)}$headerByIndent>")
out.puts
classSpec.doc.summary.foreach(summary =>
out.puts(s"$summary
")
)
out.inc
}
override def classFooter(classSpec: ClassSpec): Unit = {
out.dec
}
override def seqHeader(classSpec: ClassSpec): Unit = {
out.puts("")
out.puts("Offset Size ID Type Note ")
}
override def seqFooter(classSpec: ClassSpec): Unit = {
out.puts("
")
}
override def compileSeqAttr(classSpec: ClassSpec, attr: AttrSpec, seqPos: Option[Int], sizeElement: Sized, sizeContainer: Sized): Unit = {
out.puts("")
out.puts(s"${GraphvizClassCompiler.seqPosToStr(seqPos).getOrElse("???")} ")
out.puts(s"... ")
out.puts(s"${attr.id.humanReadable} ")
out.puts(s"${kaitaiType2NativeType(attr.dataType)} ")
out.puts(s"${attr.doc.summary.getOrElse("")} ")
out.puts(" ")
}
override def compileParseInstance(classSpec: ClassSpec, inst: ParseInstanceSpec): Unit = {
out.puts(s"Parse instance: ${inst.id.humanReadable}
")
out.puts("")
out.puts("")
out.puts(s"${expression(inst.pos)} ")
out.puts(s"... ")
out.puts(s"${inst.id.humanReadable} ")
out.puts(s"${kaitaiType2NativeType(inst.dataType)} ")
out.puts(s"${inst.doc.summary.getOrElse("")} ")
out.puts(" ")
out.puts("
")
}
override def compileValueInstance(vis: ValueInstanceSpec): Unit = {
out.puts(s"value instance: ${vis}")
}
override def compileEnum(enumName: String, enumColl: EnumSpec): Unit = {
out.puts(s"")
out.puts(s"<$headerByIndent>Enum: $enumName$headerByIndent>")
out.puts
out.puts("")
out.puts("")
out.puts("ID Name Note ")
out.puts(" ")
enumColl.sortedSeq.foreach { case (id, value) =>
out.puts("")
out.puts(s"$id ${value.name} ${value.doc.summary.getOrElse("")} ")
out.puts("")
}
out.puts("
")
}
def headerByIndent: String = s"h${out.indentLevel + 1}"
def expression(exOpt: Option[Ast.expr]): String = {
exOpt match {
case Some(ex) => translator.translate(ex)
case None => ""
}
}
}
object HtmlClassCompiler extends LanguageCompilerStatic {
// FIXME: Unused, should be probably separated from LanguageCompilerStatic
override def getCompiler(
tp: ClassTypeProvider,
config: RuntimeConfig
): LanguageCompiler = ???
def type2str(name: String): String = Utils.upperCamelCase(name)
def classSpec2Anchor(spec: ClassSpec): String = "type-" + spec.name.mkString("-")
def enumSpec2Anchor(spec: EnumSpec): String = "enum-" + spec.name.mkString("-")
def kaitaiType2NativeType(attrType: DataType): String = attrType match {
case ut: UserType =>
"" + type2str(ut.name.last) + ""
case _ => GraphvizClassCompiler.dataTypeName(attrType)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy