FluentDocument.fromJson constructor
Creates a FluentDocument from a JSON map (result of jsonDecode). Supports both the new format (with "nodes" and "settings") and the legacy format (Root JSON directly).
Implementation
factory FluentDocument.fromJson(Map<String, dynamic> json) {
if (json.containsKey('nodes') && json.containsKey('settings')) {
// New format: wrapped with settings
final root = Root.fromJson(json['nodes'] as Map<String, dynamic>);
final doc = FluentDocument(content: root);
final settings = json['settings'] as Map<String, dynamic>;
doc.pendingLineHeight = (settings['lineHeight'] as num?)?.toDouble() ?? doc.pendingLineHeight;
doc.pendingSpacingBefore = (settings['spacingBefore'] as num?)?.toDouble() ?? doc.pendingSpacingBefore;
doc.pendingSpacingAfter = (settings['spacingAfter'] as num?)?.toDouble() ?? doc.pendingSpacingAfter;
doc.pendingFontFamily = settings['fontFamily'] as String? ?? doc.pendingFontFamily;
doc.pendingFontSize = (settings['fontSize'] as num?)?.toDouble() ?? doc.pendingFontSize;
doc.pendingTextAlign = settings['textAlign'] as String? ?? doc.pendingTextAlign;
doc.pendingIndent = (settings['indent'] as num?)?.toInt() ?? doc.pendingIndent;
doc.pendingColor = settings['color'] as String?;
doc.pendingHighlightColor = settings['highlightColor'] as String?;
if (settings['styles'] is List) {
doc.pendingStyles = (settings['styles'] as List).map((e) => e as String).toList();
}
doc.documentLanguage = settings['documentLanguage'] as String? ?? doc.documentLanguage;
// Restore comments if present
final comments = json['comments'];
if (comments is List && doc.commentProvider != null) {
doc.commentProvider!.importComments(
comments.map((e) => e as Map<String, dynamic>).toList(),
);
}
return doc;
}
// Legacy format: Root JSON directly
final root = Root.fromJson(json);
return FluentDocument(content: root);
}