save method
Implementation
Future<Uint8List?> save() async {
final arc = Arc();
// Copy template to temp path
for (final entry in templates.entries) {
// final utf16 = Uint16List.fromList(entry.value);
final name = entry.key;
if (name.startsWith('.') ||
name.endsWith('.mustache') ||
name.endsWith('.keep')) {
continue;
}
if (name.contains('.png')) {
// Base64 decode
final bytes = base64Decode(entry.value);
context.archive.addBinaryFile(name, bytes);
continue;
}
String path = name;
if (name.contains('/_.')) {
// Convert back to hidden files
path = name.replaceAll('/_.', '/.');
}
final result = entry.value.trim();
context.archive.addFile(path, result);
}
final files = <String, String>{};
arc.init(slides);
for (var i = 0; i < slides.length; i++) {
final item = slides[i];
files['ppt/slides/_rels/slide${item.order}.xml.rels'] =
item.renderRelTemplate(arc);
files['ppt/slides/slide${item.order}.xml'] = item.renderTemplate(arc);
}
for (var i = 0; i < arc.notes.length; i++) {
final note = arc.notes[i];
final slide = slides[note.slideIndex];
final rel = NotesRel(slideOrder: slide.order);
files['ppt/notesSlides/_rels/notesSlide${note.order}.xml.rels'] =
rel.toString();
files['ppt/notesSlides/notesSlide${note.order}.xml'] =
note.renderTemplate(arc);
}
final pres = Presentation(
layout: layout,
slides: slides,
);
files.addAll({
'docProps/app.xml': App(
slides: slides,
company: company,
).toString(),
'docProps/core.xml': Core(
title: title,
subject: subject,
author: author,
revision: revision,
).toString(),
'ppt/presentation.xml': pres.toString(),
'ppt/_rels/presentation.xml.rels': pres.createRel(),
'[Content_Types].xml': ContentType(
notes: arc.notes,
slides: slides,
comments: arc.comments,
).toString(),
});
// Copy assets
final futures = <Future>[];
for (final item in arc.images) {
futures.add(Future.sync(() async {
final bytes = await context.assets.getImageData(item);
if (bytes != null) {
final imgName = 'image${item.order}.${item.ext}';
// final fileName = imgName ?? path.basename(item.path);
context.archive.addBinaryFile('ppt/media/$imgName', bytes);
}
}));
}
await Future.wait(futures);
for (final entry in files.entries) {
final str = entry.value.toString();
context.archive.addFile(entry.key, str);
}
// Create .pptx file
final data = context.archive.toBytes();
if (data == null) return null;
return Uint8List.fromList(data);
}