package be.nikiroo.fanfix.reader.cli;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
import be.nikiroo.fanfix.Instance;
import be.nikiroo.fanfix.data.MetaData;
import be.nikiroo.fanfix.data.Paragraph;
import be.nikiroo.fanfix.data.Story;
-import be.nikiroo.fanfix.reader.FanfixReader;
-import be.nikiroo.fanfix.supported.BasicSupport.SupportType;
+import be.nikiroo.fanfix.reader.BasicReader;
+import be.nikiroo.fanfix.searchable.BasicSearchable;
+import be.nikiroo.fanfix.searchable.SearchableTag;
+import be.nikiroo.fanfix.supported.SupportType;
/**
* Command line {@link Story} reader.
*
* @author niki
*/
-public class CliReader extends FanfixReader {
- /**
- * Start the {@link Story} Reading.
- *
- * @throws IOException
- * in case of I/O error or if the {@link Story} was not
- * previously set
- */
- public void read() throws IOException {
- if (getStory() == null) {
+class CliReader extends BasicReader {
+ @Override
+ public void read(boolean sync) throws IOException {
+ MetaData meta = getMeta();
+
+ if (meta == null) {
throw new IOException("No story to read");
}
String title = "";
String author = "";
- MetaData meta = getStory().getMeta();
- if (meta != null) {
- if (meta.getTitle() != null) {
- title = meta.getTitle();
- }
+ 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() + ")";
- }
+ if (meta.getAuthor() != null) {
+ author = "©" + meta.getAuthor();
+ if (meta.getDate() != null && !meta.getDate().isEmpty()) {
+ author = author + " (" + meta.getDate() + ")";
}
}
System.out.println(author);
System.out.println("");
- for (Chapter chap : getStory()) {
+ // TODO: progress?
+ for (Chapter chap : getStory(null)) {
if (chap.getName() != null && !chap.getName().isEmpty()) {
System.out.println(Instance.getTrans().getString(
StringId.CHAPTER_NAMED, chap.getNumber(),
}
}
- /**
- * Read the selected chapter (starting at 1).
- *
- * @param chapter
- * the chapter
- */
- public void read(int chapter) {
- if (chapter > getStory().getChapters().size()) {
+ public void read(int chapter) throws IOException {
+ MetaData meta = getMeta();
+
+ if (meta == null) {
+ throw new IOException("No story to read");
+ }
+
+ // TODO: progress?
+ if (chapter > getStory(null).getChapters().size()) {
System.err.println("Chapter " + chapter + ": no such chapter");
} else {
- Chapter chap = getStory().getChapters().get(chapter - 1);
+ Chapter chap = getStory(null).getChapters().get(chapter - 1);
System.out.println("Chapter " + chap.getNumber() + ": "
+ chap.getName());
}
@Override
- public void start(SupportType type) {
+ public void browse(String source) {
List<MetaData> stories;
- stories = Instance.getLibrary().getList(type);
+ stories = getLibrary().getListBySource(source);
for (MetaData story : stories) {
String author = "";
+ author);
}
}
+
+ @Override
+ public void search(SupportType searchOn, String keywords, int page, int item) throws IOException {
+
+ }
+
+ @Override
+ public void searchTag(SupportType searchOn, int page, int item, String... tags) throws IOException {
+ BasicSearchable search = BasicSearchable.getSearchable(searchOn);
+ List<SearchableTag> stags = search.getTags();
+
+
+ SearchableTag stag = null;
+ for (String tag : tags) {
+ stag = null;
+ for (int i = 0 ; i < stags.size() ; i++) {
+ if (stags.get(i).getName().equalsIgnoreCase(tag)) {
+ stag = stags.get(i);
+ break;
+ }
+ }
+
+ if (stag != null) {
+ search.fillTag(stag);
+ stags = stag.getChildren();
+ } else {
+ stags = new ArrayList<SearchableTag>();
+ break;
+ }
+ }
+
+ if (stag != null) {
+ if (page <= 0) {
+ if (stag.isLeaf()) {
+ System.out.println(stag.getPages());
+ } else {
+ System.out.println(stag.getCount());
+ }
+ } else {
+ List<MetaData> metas = null;
+ List<SearchableTag> 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);
+ System.out.println(item + ": " + meta.getTitle());
+ 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("");
+ }
+ } else {
+ SearchableTag subtag = subtags.get(item - 1);
+ // TODO: display fixed info, not debug
+ System.out.println(subtag);
+ }
+ } else {
+ System.out.println("Invalid item: only " + count + " items found");
+ }
+ } else {
+ if (metas != null) {
+ int i = 0;
+ for (MetaData meta : metas) {
+ System.out.println((i + 1) + ": " + meta.getTitle());
+ i++;
+ }
+ } else {
+ for (SearchableTag subtag : subtags) {
+ if (subtag.getCount() > 0) {
+ System.out.println(subtag.getName() + " (" + subtag.getCount() + ")");
+ } else {
+ System.out.println(subtag.getName());
+ }
+ }
+ }
+ }
+ }
+ } else {
+ for (SearchableTag s : stags) {
+ System.out.println(s.getName());
+ }
+ }
+ }
}