message: Add AssDanmakuDocument
diff: }
  text(fontStyles)
  {
  - return `Dialogue: ${this.time}, ${this.endTime}, ${fontStyles[this.fontSize]}, {${this.typeTag}\\c&H${this.color}&}${this.content}`;
  + const style = fontStyles[this.fontSize].match(/Dialogue.*?,.*?,.*?,(.*?),/)[1].trim();
  + return `Dialogue: 0,${this.time},${this.endTime},${style},,0,0,0,,{${this.typeTag}\\c&H${this.color}&}${this.content}`;
  + }
  + }
  + class AssDanmakuDocument
  + {
  + constructor(danmakus)
  + {
  + this.danmakus = danmakus;
  + }
  + generateAss({ title, fontStyles })
  + {
  + const meta = `
  +[Script Info]
  +; Script generated by Bilibili Evolved Danmaku Converter
  +; https://github.com/the1812/Bilibili-Evolved/
  +Title: ${title}
  +ScriptType: v4.00+
  +PlayResX: 1920
  +PlayResY: 1080
  +Timer: 10.0000
  +WrapStyle: 2
  +ScaledBorderAndShadow: no
  +
  +[V4+ Styles]
  +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
  +${Object.values(fontStyles).join("\n")}
  +
  +[Events]
  +Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
  + `.trim();
  + return meta + "\n" + danmakus.map(it => it.text(fontStyles)).join("\n");
  }
  }
  };
  