exportToHtml method

Future<String> exportToHtml()

Implementation

Future<String> exportToHtml() async {
  // Pre-fetch all images to embed them as data URI
  await _prefetchImages();

  final root = document.content;
  final buffer = StringBuffer();
  buffer.writeln('<!DOCTYPE html>');
  buffer.writeln('<html><head><meta charset="utf-8"><title>Document</title>');
  buffer.writeln('<style>');
  buffer.writeln('p { margin: 0 0 4px 0; }');
  buffer.writeln('body { font-family: DejaVu Sans, Helvetica, sans-serif; font-size: 14px; margin: 40px; line-height: 1.4; color: #222; }');
  buffer.writeln('h1 { font-size: 28px; margin: 24px 0 12px; }');
  buffer.writeln('h2 { font-size: 22px; margin: 20px 0 10px; }');
  buffer.writeln('h3 { font-size: 18px; margin: 16px 0 8px; }');
  buffer.writeln('h4 { font-size: 16px; margin: 14px 0 6px; }');
  buffer.writeln('h5 { font-size: 14px; margin: 12px 0 4px; }');
  buffer.writeln('h6 { font-size: 13px; margin: 10px 0 2px; }');
  buffer.writeln('blockquote { border-left: 3px solid #999; margin: 12px 0; padding: 8px 16px; font-style: italic; font-family: Georgia, serif; color: #555; }');
  buffer.writeln('pre { background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; padding: 12px; font-family: "Courier New", monospace; font-size: 13px; white-space: pre-wrap; margin: 8px 0; }');
  buffer.writeln('table { border-collapse: collapse; margin: 12px 0; }');
  buffer.writeln('td, th { border: 1px solid #999; padding: 4px 8px; vertical-align: top; }');
  buffer.writeln('img { max-width: 100%; }');
  buffer.writeln('a { color: #1a73e8; }');
  buffer.writeln('hr { border: none; border-top: 1px solid #ccc; margin: 16px 0; }');
  buffer.writeln('</style>');
  buffer.writeln('</head><body>');

  _writeHtmlNodes(root.nodes, buffer);

  buffer.writeln('</body></html>');
  return buffer.toString();
}