package info.opencards.pptintegration;
import com.thoughtworks.xstream.XStream;
import info.opencards.Utils;
import info.opencards.core.CardFile;
import info.opencards.core.FlashCard;
import info.opencards.core.FlashCardCollection;
import info.opencards.core.LearnStatusSerializer;
import info.opencards.md.MarkdownFlashcard;
import info.opencards.md.MarkdownParserKt;
import info.opencards.util.InvalidCardFileFormatException;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import java.io.*;
import java.util.List;
/**
* Allows to load ppt-files and create flashcard collections from the slides. These collections are serialized along
* with ppt files in a hidden folder named .opencards
*
* @author Holger Brandl
*/
public class PPTSerializer implements LearnStatusSerializer {
public FlashCardCollection readFlashcardsFromFile(CardFile cardFile) {
Utils.log("extracting flashcards from file '" + cardFile + "'...");
FlashCardCollection fc = new FlashCardCollection();
try {
if (cardFile.getFileLocation().getName().endsWith(".ppt")) {
FileInputStream is = new FileInputStream(cardFile.getFileLocation());
HSLFSlideShow ppt = new HSLFSlideShow(is);
for (HSLFSlide xslfSlide : ppt.getSlides()) {
String slideTitle = xslfSlide.getTitle();
if (slideTitle == null)
continue;
// old OC1.x approach to create a unique card-id
// int cardID = Utils.getRandGen().nextInt(Integer.MAX_VALUE);
fc.add(new FlashCard(slideTitle.hashCode(), slideTitle, xslfSlide.getSlideNumber()));
}
} else if (cardFile.getFileLocation().getName().endsWith(".md")) {
boolean useSelector = cardFile.getProperties().useMarkdownSelector();
List<MarkdownFlashcard> flashcards = MarkdownParserKt.parseMD(cardFile.getFileLocation(), useSelector);
for (int i = 0; i < flashcards.size(); i++) {
MarkdownFlashcard card = flashcards.get(i);
String question = card.getQuestion();
if (question.trim().isEmpty()) {
continue;
}
fc.add(new FlashCard(question.hashCode(), question, i + 1));
}
} else {
throw new InvalidCardFileFormatException();
}
} catch (IOException e) {
// rephrase IO problem into something more specific
throw new InvalidCardFileFormatException();
}
return fc;
}
public void serializeFileCards(CardFile cardFile, FlashCardCollection fileItems) {
File metaDataFile = getMetaDataFile(cardFile);
try {
BufferedWriter out = new BufferedWriter(new FileWriter(metaDataFile));
// String serialItCo = StringCompressUtils.compress2(new XStream().toXML(fileItems));
out.write(new XStream().toXML(fileItems));
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public FlashCardCollection deserializeFileCards(CardFile cardFile) {
File metaDataFile = getMetaDataFile(cardFile);
if (metaDataFile == null || !metaDataFile.isFile())
return null;
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(metaDataFile));
XStream xStream = new XStream();
xStream.ignoreUnknownElements();
return (FlashCardCollection) xStream.fromXML(bis);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
public static File getMetaDataFile(CardFile cardFile) {
File directory = cardFile.getFileLocation().getParentFile();
if (!directory.isDirectory()) {
return null;
}
File metadataDirectory = Utils.getOrCreateHiddenOCDirectory(directory);
return new File(metadataDirectory, cardFile.getFileLocation().getName() + ".xml");
}
}