556052149d7c120305df7ab206e10b80618af703
[nikiroo-utils.git] / src / be / nikiroo / fanfix / reader / cli / CliReader.java
1 package be.nikiroo.fanfix.reader.cli;
2
3 import java.io.IOException;
4 import java.util.List;
5
6 import be.nikiroo.fanfix.Instance;
7 import be.nikiroo.fanfix.bundles.StringId;
8 import be.nikiroo.fanfix.data.Chapter;
9 import be.nikiroo.fanfix.data.MetaData;
10 import be.nikiroo.fanfix.data.Paragraph;
11 import be.nikiroo.fanfix.data.Story;
12 import be.nikiroo.fanfix.reader.BasicReader;
13 import be.nikiroo.fanfix.searchable.BasicSearchable;
14 import be.nikiroo.fanfix.searchable.SearchableTag;
15 import be.nikiroo.fanfix.supported.SupportType;
16 import be.nikiroo.utils.StringUtils;
17
18 /**
19 * Command line {@link Story} reader.
20 * <p>
21 * Will output stories to the console.
22 *
23 * @author niki
24 */
25 class CliReader extends BasicReader {
26 @Override
27 public void read(boolean sync) throws IOException {
28 MetaData meta = getMeta();
29
30 if (meta == null) {
31 throw new IOException("No story to read");
32 }
33
34 String title = "";
35 String author = "";
36
37 if (meta.getTitle() != null) {
38 title = meta.getTitle();
39 }
40
41 if (meta.getAuthor() != null) {
42 author = "©" + meta.getAuthor();
43 if (meta.getDate() != null && !meta.getDate().isEmpty()) {
44 author = author + " (" + meta.getDate() + ")";
45 }
46 }
47
48 System.out.println(title);
49 System.out.println(author);
50 System.out.println("");
51
52 // TODO: progress?
53 for (Chapter chap : getStory(null)) {
54 if (chap.getName() != null && !chap.getName().isEmpty()) {
55 System.out.println(Instance.getInstance().getTrans().getString(StringId.CHAPTER_NAMED, chap.getNumber(),
56 chap.getName()));
57 } else {
58 System.out.println(
59 Instance.getInstance().getTrans().getString(StringId.CHAPTER_UNNAMED, chap.getNumber()));
60 }
61 }
62 }
63
64 public void read(int chapter) throws IOException {
65 MetaData meta = getMeta();
66
67 if (meta == null) {
68 throw new IOException("No story to read");
69 }
70
71 // TODO: progress?
72 if (chapter > getStory(null).getChapters().size()) {
73 System.err.println("Chapter " + chapter + ": no such chapter");
74 } else {
75 Chapter chap = getStory(null).getChapters().get(chapter - 1);
76 System.out.println("Chapter " + chap.getNumber() + ": "
77 + chap.getName());
78
79 for (Paragraph para : chap) {
80 System.out.println(para.getContent());
81 System.out.println("");
82 }
83 }
84 }
85
86 @Override
87 public void browse(String source) throws IOException {
88 List<MetaData> stories = getLibrary().getListBySource(source);
89
90 for (MetaData story : stories) {
91 String author = "";
92 if (story.getAuthor() != null && !story.getAuthor().isEmpty()) {
93 author = " (" + story.getAuthor() + ")";
94 }
95
96 System.out.println(story.getLuid() + ": " + story.getTitle()
97 + author);
98 }
99 }
100
101 @Override
102 public void search(boolean sync) throws IOException {
103 for (SupportType type : SupportType.values()) {
104 if (BasicSearchable.getSearchable(type) != null) {
105 System.out.println(type);
106 }
107 }
108 }
109
110 @Override
111 public void search(SupportType searchOn, String keywords, int page,
112 int item, boolean sync) throws IOException {
113 BasicSearchable search = BasicSearchable.getSearchable(searchOn);
114
115 if (page == 0) {
116 System.out.println(search.searchPages(keywords));
117 } else {
118 List<MetaData> metas = search.search(keywords, page);
119
120 if (item == 0) {
121 System.out.println("Page " + page + " of stories for: "
122 + keywords);
123 displayStories(metas);
124 } else {
125 // ! 1-based index !
126 if (item <= 0 || item > metas.size()) {
127 throw new IOException("Index out of bounds: " + item);
128 }
129
130 MetaData meta = metas.get(item - 1);
131 displayStory(meta);
132 }
133 }
134 }
135
136 @Override
137 public void searchTag(SupportType searchOn, int page, int item,
138 boolean sync, Integer... tags) throws IOException {
139
140 BasicSearchable search = BasicSearchable.getSearchable(searchOn);
141 SearchableTag stag = search.getTag(tags);
142
143 if (stag == null) {
144 // TODO i18n
145 System.out.println("Known tags: ");
146 int i = 1;
147 for (SearchableTag s : search.getTags()) {
148 System.out.println(String.format("%d: %s", i, s.getName()));
149 i++;
150 }
151 } else {
152 if (page <= 0) {
153 if (stag.isLeaf()) {
154 System.out.println(search.searchPages(stag));
155 } else {
156 System.out.println(stag.getCount());
157 }
158 } else {
159 List<MetaData> metas = null;
160 List<SearchableTag> subtags = null;
161 int count;
162
163 if (stag.isLeaf()) {
164 metas = search.search(stag, page);
165 count = metas.size();
166 } else {
167 subtags = stag.getChildren();
168 count = subtags.size();
169 }
170
171 if (item > 0) {
172 if (item <= count) {
173 if (metas != null) {
174 MetaData meta = metas.get(item - 1);
175 displayStory(meta);
176 } else {
177 SearchableTag subtag = subtags.get(item - 1);
178 displayTag(subtag);
179 }
180 } else {
181 System.out.println("Invalid item: only " + count
182 + " items found");
183 }
184 } else {
185 if (metas != null) {
186 // TODO i18n
187 System.out.println(String.format("Content of %s: ",
188 stag.getFqName()));
189 displayStories(metas);
190 } else {
191 // TODO i18n
192 System.out.println(String.format("Subtags of %s: ",
193 stag.getFqName()));
194 displayTags(subtags);
195 }
196 }
197 }
198 }
199 }
200
201 private void displayTag(SearchableTag subtag) {
202 // TODO: i18n
203 String stories = "stories";
204 String num = StringUtils.formatNumber(subtag.getCount());
205 System.out.println(String.format("%s (%s), %s %s", subtag.getName(),
206 subtag.getFqName(), num, stories));
207 }
208
209 private void displayStory(MetaData meta) {
210 System.out.println(meta.getTitle());
211 System.out.println();
212 System.out.println(meta.getUrl());
213 System.out.println();
214 System.out.println("Tags: " + meta.getTags());
215 System.out.println();
216 for (Paragraph para : meta.getResume()) {
217 System.out.println(para.getContent());
218 System.out.println("");
219 }
220 }
221
222 private void displayTags(List<SearchableTag> subtags) {
223 int i = 1;
224 for (SearchableTag subtag : subtags) {
225 String total = "";
226 if (subtag.getCount() > 0) {
227 total = StringUtils.formatNumber(subtag.getCount());
228 }
229
230 if (total.isEmpty()) {
231 System.out
232 .println(String.format("%d: %s", i, subtag.getName()));
233 } else {
234 System.out.println(String.format("%d: %s (%s)", i,
235 subtag.getName(), total));
236 }
237
238 i++;
239 }
240 }
241
242 private void displayStories(List<MetaData> metas) {
243 int i = 1;
244 for (MetaData meta : metas) {
245 System.out.println(i + ": " + meta.getTitle());
246 i++;
247 }
248 }
249 }