package be.nikiroo.fanfix.reader;
import java.io.IOException;
import java.util.List;
import be.nikiroo.fanfix.Instance;
import be.nikiroo.fanfix.bundles.StringId;
import be.nikiroo.fanfix.data.Chapter;
import be.nikiroo.fanfix.data.MetaData;
import be.nikiroo.fanfix.data.Paragraph;
import be.nikiroo.fanfix.data.Story;
import be.nikiroo.fanfix.searchable.BasicSearchable;
import be.nikiroo.fanfix.searchable.SearchableTag;
import be.nikiroo.fanfix.supported.SupportType;
import be.nikiroo.utils.Image;
import be.nikiroo.utils.StringUtils;
/**
* Command line {@link Story} reader.
*
* Will output stories to the console.
*
* @author niki
*/
public class CliReader extends BasicReader {
public void listBooks(String source) throws IOException {
List stories = Instance.getInstance().getLibrary().getList()
.filter(source, null, null);
for (MetaData story : stories) {
String author = "";
if (story.getAuthor() != null && !story.getAuthor().isEmpty()) {
author = " (" + story.getAuthor() + ")";
}
System.out.println(
story.getLuid() + ": " + story.getTitle() + author);
}
}
public void listChapters(Story story) throws IOException {
if (story == null || story.getMeta() == null) {
throw new IOException("No story to read");
}
MetaData meta = story.getMeta();
if (meta == null) {
throw new IOException("No story to read");
}
String title = "";
String author = "";
if (meta.getTitle() != null) {
title = meta.getTitle();
}
if (meta.getAuthor() != null) {
author = "©" + meta.getAuthor();
if (meta.getDate() != null && !meta.getDate().isEmpty()) {
author = author + " (" + meta.getDate() + ")";
}
}
System.out.println(title);
System.out.println(author);
System.out.println("");
for (Chapter chap : story) {
if (chap.getName() != null && !chap.getName().isEmpty()) {
System.out.println(Instance.getInstance().getTrans().getString(
StringId.CHAPTER_NAMED, chap.getNumber(),
chap.getName()));
} else {
System.out.println(Instance.getInstance().getTrans()
.getString(StringId.CHAPTER_UNNAMED, chap.getNumber()));
}
}
}
public void printChapter(Story story, int chapter) throws IOException {
if (story == null || story.getMeta() == null) {
throw new IOException("No story to read");
}
MetaData meta = story.getMeta();
if (meta == null) {
throw new IOException("No story to read");
}
if (chapter <= 0 || chapter > story.getChapters().size()) {
System.err.println("Chapter " + chapter + ": no such chapter");
} else {
Chapter chap = story.getChapters().get(chapter - 1);
System.out.println(
"Chapter " + chap.getNumber() + ": " + chap.getName());
System.out.println();
for (Paragraph para : chap) {
Image img = para.getContentImage();
if (img != null) {
String sz = StringUtils.formatNumber(img.getSize(), 1);
System.out.println("[Image: " + sz + "]");
} else {
System.out.println(
para.getContent() == null ? "" : para.getContent());
}
System.out.println("");
}
}
}
public void listSearchables() throws IOException {
for (SupportType type : SupportType.values()) {
if (BasicSearchable.getSearchable(type) != null) {
System.out.println(type);
}
}
}
public void searchBooksByKeyword(SupportType searchOn, String keywords,
int page, int item) throws IOException {
BasicSearchable search = BasicSearchable.getSearchable(searchOn);
if (page == 0) {
System.out.println(search.searchPages(keywords));
} else {
List metas = search.search(keywords, page);
if (item == 0) {
System.out.println(
"Page " + page + " of stories for: " + keywords);
displayStories(metas);
} else {
// ! 1-based index !
if (item <= 0 || item > metas.size()) {
throw new IOException("Index out of bounds: " + item);
}
MetaData meta = metas.get(item - 1);
displayStory(meta);
}
}
}
public void searchBooksByTag(SupportType searchOn, int page, int item,
Integer... tags) throws IOException {
BasicSearchable search = BasicSearchable.getSearchable(searchOn);
SearchableTag stag = search.getTag(tags);
if (stag == null) {
// TODO i18n
System.out.println("Known tags: ");
int i = 1;
for (SearchableTag s : search.getTags()) {
System.out.println(String.format("%d: %s", i, s.getName()));
i++;
}
} else {
if (page <= 0) {
if (stag.isLeaf()) {
System.out.println(search.searchPages(stag));
} else {
System.out.println(stag.getCount());
}
} else {
List metas = null;
List subtags = null;
int count;
if (stag.isLeaf()) {
metas = search.search(stag, page);
count = metas.size();
} else {
subtags = stag.getChildren();
count = subtags.size();
}
if (item > 0) {
if (item <= count) {
if (metas != null) {
MetaData meta = metas.get(item - 1);
displayStory(meta);
} else {
SearchableTag subtag = subtags.get(item - 1);
displayTag(subtag);
}
} else {
System.out.println(
"Invalid item: only " + count + " items found");
}
} else {
if (metas != null) {
// TODO i18n
System.out.println(String.format("Content of %s: ",
stag.getFqName()));
displayStories(metas);
} else {
// TODO i18n
System.out.println(String.format("Subtags of %s: ",
stag.getFqName()));
displayTags(subtags);
}
}
}
}
}
private void displayTag(SearchableTag subtag) {
// TODO: i18n
String stories = "stories";
String num = StringUtils.formatNumber(subtag.getCount());
System.out.println(String.format("%s (%s), %s %s", subtag.getName(),
subtag.getFqName(), num, stories));
}
private void displayStory(MetaData meta) {
System.out.println(meta.getTitle());
System.out.println();
System.out.println(meta.getUrl());
System.out.println();
System.out.println("Tags: " + meta.getTags());
System.out.println();
for (Paragraph para : meta.getResume()) {
System.out.println(para.getContent());
System.out.println("");
}
}
private void displayTags(List subtags) {
int i = 1;
for (SearchableTag subtag : subtags) {
String total = "";
if (subtag.getCount() > 0) {
total = StringUtils.formatNumber(subtag.getCount());
}
if (total.isEmpty()) {
System.out
.println(String.format("%d: %s", i, subtag.getName()));
} else {
System.out.println(String.format("%d: %s (%s)", i,
subtag.getName(), total));
}
i++;
}
}
private void displayStories(List metas) {
int i = 1;
for (MetaData meta : metas) {
System.out.println(i + ": " + meta.getTitle());
i++;
}
}
}