From 8b153400ae5ab24891446be1b3423ea17e71b49c Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 13 Apr 2019 13:32:18 +0200 Subject: [PATCH] change search syntax --- README-fr.md | 8 + README.md | 8 + src/be/nikiroo/fanfix/Main.java | 167 +++++++++++------- .../fanfix/bundles/resources_core.properties | 9 +- .../bundles/resources_core_fr.properties | 13 +- src/be/nikiroo/fanfix/reader/Reader.java | 8 +- .../nikiroo/fanfix/reader/cli/CliReader.java | 62 +++---- .../reader/tui/TuiReaderApplication.java | 11 +- 8 files changed, 176 insertions(+), 110 deletions(-) diff --git a/README-fr.md b/README-fr.md index cb76040..1021769 100644 --- a/README-fr.md +++ b/README-fr.md @@ -10,6 +10,10 @@ Fanfix est un petit programme Java qui peut télécharger des histoires sur inte - ```fanfix``` --convert [*URL*] [*output_type*] [*target*] (+info) - ```fanfix``` --read [*id*] ([*chapter number*]) - ```fanfix``` --read-url [*URL*] ([*chapter number*]) +- ```fanfix``` --search +- ```fanfix``` --search [*where*] [*keywords*] (page [*page*]) (item [*item*]) +- ```fanfix``` --tag +- ```fanfix``` --tag [*index 1*]... (page [*page*]) (item [*item*]) - ```fanfix``` --list - ```fanfix``` --set-reader [*GUI* | *TUI* | *CLI*] - ```fanfix``` --server [*key*] [*port*] @@ -85,6 +89,10 @@ Les arguments suivants sont aussi supportés : - ```--convert [URL] [output_type] [target] (+info)```: convertir l'histoire vers le fichier donné, et forcer l'ajout d'un fichier .info si +info est utilisé - ```--read [id] ([chapter number])```: afficher l'histoire "id" - ```--read-url [URL] ([chapter number])```: convertir l'histoire et la lire à la volée, sans la sauver +- ```--search```: liste les sites supportés (```where```) +- ```--search [where] [keywords] (page [page]) (item [item])```: lance une recherche et affiche les résultats de la page ```page``` (page 1 par défaut), et de l'item ```item``` spécifique si demandé +- ```--tag [where]```: liste tous les tags supportés par ce site web +- ```--tag [index 1]... (page [page]) (item [item])```: affine la recherche, tag par tag, et affiche si besoin les sous-tags, les histoires ou les infos précises de l'histoire demandée - ```--list```: lister les histoires presentes dans la librairie et leurs IDs - ```--set-reader [reader type]```: changer le type de lecteur pour la commande en cours sur CLI, TUI ou GUI - ```--server [key] [port]```: démarrer un serveur d'histoires sur ce port diff --git a/README.md b/README.md index 22e0b60..bc003c7 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,10 @@ Fanfix is a small Java program that can download stories from some supported web - ```fanfix``` --convert [*URL*] [*output_type*] [*target*] (+info) - ```fanfix``` --read [*id*] ([*chapter number*]) - ```fanfix``` --read-url [*URL*] ([*chapter number*]) +- ```fanfix``` --search +- ```fanfix``` --search [*where*] [*keywords*] (page [*page*]) (item [*item*]) +- ```fanfix``` --tag +- ```fanfix``` --tag [*index 1*]... (page [*page*]) (item [*item*]) - ```fanfix``` --list - ```fanfix``` --set-reader [*GUI* | *TUI* | *CLI*] - ```fanfix``` --server [*key*] [*port*] @@ -85,6 +89,10 @@ The following arguments are also allowed: - ```--convert [URL] [output_type] [target] (+info)```: convert the story at URL into target, and force-add the .info and cover if +info is passed - ```--read [id] ([chapter number])```: read the given story denoted by ID from the library - ```--read-url [URL] ([chapter number])```: convert on the fly and read the story at URL, without saving it +- ```--search```: list the supported websites (```where```) +- ```--search [where] [keywords] (page [page]) (item [item])```: search on the supported website and display the given results page of stories it found, or the story details if asked +- ```--tag [where]```: list all the tags supported by this website +- ```--tag [index 1]... (page [page]) (item [item])```: search for the given stories or subtags, tag by tag, and display information about a specific page of results or about a specific item if requested - ```--list```: list the stories present in the library and their associated IDs - ```--set-reader [reader type]```: set the reader type to CLI, TUI or GUI for this command - ```--server [key] [port]```: start a story server on this port diff --git a/src/be/nikiroo/fanfix/Main.java b/src/be/nikiroo/fanfix/Main.java index d5a5deb..6fc49c5 100644 --- a/src/be/nikiroo/fanfix/Main.java +++ b/src/be/nikiroo/fanfix/Main.java @@ -35,7 +35,7 @@ import be.nikiroo.utils.serial.server.ServerObject; */ public class Main { private enum MainAction { - IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START, VERSION, SERVER, STOP_SERVER, REMOTE, SET_SOURCE, SET_TITLE, SET_AUTHOR, SEARCH, SEARCH_TAG + IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START, VERSION, SERVER, STOP_SERVER, REMOTE, SET_SOURCE, SET_TITLE, SET_AUTHOR, SEARCH, TAG } /** @@ -61,11 +61,14 @@ public class Main { * *
  • --read-url [URL] ([chapter number]): convert on the fly and read the * story, without saving it
  • - *
  • --search WEBSITE [free text] ([page] ([item])): search for the given terms, - * show the given page (page 0 means "how many page do we have", starts at page 1)
  • - *
  • --search-tag WEBSITE ([tag 1] [tag2...] ([page] ([item]))): list the known - * tags or search the stories for the given tag(s), show the given page of results - * (page 0 means "how many page do we have", starts at page 1)
  • + *
  • --search: list the supported websites (where)
  • + *
  • --search [where] [keywords] (page [page]) (item [item]): search on + * the supported website and display the given results page of stories it + * found, or the story details if asked
  • + *
  • --tag [where]: list all the tags supported by this website
  • + *
  • --tag [index 1]... (page [page]) (item [item]): search for the given + * stories or subtags, tag by tag, and display information about a specific + * page of results or about a specific item if requested
  • *
  • --list ([type]): list the stories present in the library
  • *
  • --set-source [id] [new source]: change the source of the given story
  • *
  • --set-title [id] [new title]: change the title of the given story
  • @@ -97,7 +100,7 @@ public class Main { Integer port = null; SupportType searchOn = null; String search = null; - List tags = new ArrayList(); + List tags = new ArrayList(); Integer page = null; Integer item = null; @@ -215,13 +218,13 @@ public class Main { case SEARCH: if (searchOn == null) { searchOn = SupportType.valueOfAllOkUC(args[i]); - + if (searchOn == null) { Instance.getTraceHandler().error( "Website not known: <" + args[i] + ">"); exitCode = 255; } - + if (BasicSearchable.getSearchable(searchOn) == null) { Instance.getTraceHandler().error( "Website not supported: " + searchOn); @@ -229,45 +232,82 @@ public class Main { } } else if (search == null) { search = args[i]; - } else if (page == null) { + } else if (page != null && page == -1) { try { page = Integer.parseInt(args[i]); - } catch (NumberFormatException e) { - Instance.getTraceHandler().error( - new Exception("Incorrect page number: <" - + args[i] + ">", e)); - exitCode = 255; + } catch (Exception e) { + page = -2; } - } else if (item == null) { + } else if (item != null && item == -1) { try { item = Integer.parseInt(args[i]); - } catch (NumberFormatException e) { - Instance.getTraceHandler().error( - new Exception("Incorrect item number: <" - + args[i] + ">", e)); + } catch (Exception e) { + item = -2; + } + } else if (page == null || item == null) { + if (page == null && "page".equals(args[i])) { + page = -1; + } else if (item == null && "item".equals(args[i])) { + item = -1; + } else { exitCode = 255; } } else { exitCode = 255; } break; - case SEARCH_TAG: + case TAG: if (searchOn == null) { searchOn = SupportType.valueOfAllOkUC(args[i]); - + if (searchOn == null) { Instance.getTraceHandler().error( "Website not known: <" + args[i] + ">"); exitCode = 255; } - + if (BasicSearchable.getSearchable(searchOn) == null) { Instance.getTraceHandler().error( "Website not supported: " + searchOn); exitCode = 255; } + } else if (page == null && item == null) { + if ("page".equals(args[i])) { + page = -1; + } else if ("item".equals(args[i])) { + item = -1; + } else { + try { + int index = Integer.parseInt(args[i]); + tags.add(index); + } catch (NumberFormatException e) { + Instance.getTraceHandler().error( + "Invalid tag index: " + args[i]); + exitCode = 255; + } + } + } else if (page != null && page == -1) { + try { + page = Integer.parseInt(args[i]); + } catch (Exception e) { + page = -2; + } + } else if (item != null && item == -1) { + try { + item = Integer.parseInt(args[i]); + } catch (Exception e) { + item = -2; + } + } else if (page == null || item == null) { + if (page == null && "page".equals(args[i])) { + page = -1; + } else if (item == null && "item".equals(args[i])) { + item = -1; + } else { + exitCode = 255; + } } else { - tags.add(args[i]); + exitCode = 255; } break; case HELP: @@ -429,18 +469,20 @@ public class Main { exitCode = read(urlString, chapString, false); break; case SEARCH: - if (searchOn == null || search == null) { + page = page == null ? 1 : page; + if (page < 0) { + Instance.getTraceHandler().error("Incorrect page number"); exitCode = 255; break; } - - if (page == null) { - page = 1; - } - if (item == null) { - item = 0; + + item = item == null ? 0 : item; + if (item < 0) { + Instance.getTraceHandler().error("Incorrect item number"); + exitCode = 255; + break; } - + if (BasicReader.getReader() == null) { Instance.getTraceHandler() .error(new Exception( @@ -448,38 +490,44 @@ public class Main { exitCode = 10; break; } - - try { - BasicReader.getReader().search(searchOn, search, page, item); - } catch (IOException e1) { - Instance.getTraceHandler().error(e1); + + if (searchOn == null || search == null) { + // TODO: do on reader!!! + for (SupportType type : SupportType.values()) { + if (BasicSearchable.getSearchable(type) != null) { + System.out.println(type); + } + } + } else { + try { + BasicReader.getReader().search(searchOn, search, page, + item); + } catch (IOException e1) { + Instance.getTraceHandler().error(e1); + } } - + break; - case SEARCH_TAG: + case TAG: if (searchOn == null) { exitCode = 255; break; } - - item = 0; - page = 1; - try { - page = Integer.parseInt(tags.get(tags.size()-1)); - tags.remove(tags.size() - 1); - - try { - int tmp = Integer.parseInt(tags.get(tags.size()-1)); - tags.remove(tags.size() - 1); - - item = page; - page = tmp; - } catch (Exception e) { - } - } catch (Exception e) { + page = page == null ? 1 : page; + if (page < 0) { + Instance.getTraceHandler().error("Incorrect page number"); + exitCode = 255; + break; } - + + item = item == null ? 0 : item; + if (item < 0) { + Instance.getTraceHandler().error("Incorrect item number"); + exitCode = 255; + break; + } + if (BasicReader.getReader() == null) { Instance.getTraceHandler() .error(new Exception( @@ -487,13 +535,14 @@ public class Main { exitCode = 10; break; } - + try { - BasicReader.getReader().searchTag(searchOn, page, item, tags.toArray(new String[]{})); + BasicReader.getReader().searchTag(searchOn, page, item, + tags.toArray(new Integer[] {})); } catch (IOException e1) { Instance.getTraceHandler().error(e1); } - + break; case HELP: syntax(true); diff --git a/src/be/nikiroo/fanfix/bundles/resources_core.properties b/src/be/nikiroo/fanfix/bundles/resources_core.properties index 6a08973..e244122 100644 --- a/src/be/nikiroo/fanfix/bundles/resources_core.properties +++ b/src/be/nikiroo/fanfix/bundles/resources_core.properties @@ -20,7 +20,14 @@ HELP_SYNTAX = Valid options:\n\ \t\tgiven page (page 0 means "how many page do we have", starts at page 1)\n\ \t--search-tag WEBSITE ([tag 1] [tag2...] ([page] ([item]))): list the known tags or \n\ \t\tsearch the stories for the given tag(s), show the given page of results\n\ -\t\t(page 0 means "how many page do we have", starts at page 1)\n\ +\t--search: list the supported websites (where)\n\ +\t--search [where] [keywords] (page [page]) (item [item]): search on the supported \n\ +\t\twebsite and display the given results page of stories it found, or the story \n\ +\t\tdetails if asked\n\ +\t--tag [where]: list all the tags supported by this website\n\ +\t--tag [index 1]... (page [page]) (item [item]): search for the given stories or \n\ +\t\tsubtags, tag by tag, and display information about a specific page of results or \n\ +\t\tabout a specific item if requested\n\ \t--list ([type]) : list the stories present in the library\n\ \t--set-source [id] [new source]: change the source of the given story\n\ \t--set-title [id] [new title]: change the title of the given story\n\ diff --git a/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties b/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties index 149391e..71c0411 100644 --- a/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties +++ b/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties @@ -15,11 +15,14 @@ HELP_SYNTAX = Options reconnues :\n\ \t--convert [URL] [output_type] [target] (+info): convertir l'histoire vers le fichier donné, et forcer l'ajout d'un fichier .info si +info est utilisé\n\ \t--read [id] ([chapter number]): afficher l'histoire "id"\n\ \t--read-url [URL] ([chapter number]): convertir l'histoire et la lire à la volée, sans la sauver\n\ -\t--search WEBSITE [texte libre] ([page] ([item])): cherche des histoires, affiche la\n\ -\t\tpage de résultats demandée (la page 0 affiche le nombre de pages, la première page est la page 1)\n\ -\t--search-tag WEBSITE ([tag 1] [tag2...] ([page] ([item]))): list the known tags or \n\ -\t\tcherche des histoires avec le/les tag(s) demandé(s), affiche la page de résultats demandée\n\ -\t\t(la page 0 affiche le nombre de pages, la première page est la page 1)\n\ +\t--search: liste les sites supportés (where)\n\ +\t--search [where] [keywords] (page [page]) (item [item]): lance une recherche et \n\ +\t\taffiche les résultats de la page page (page 1 par défaut), et de l'item item \n\ +\t\tspécifique si demandé\n\ +\t--tag [where]: liste tous les tags supportés par ce site web\n\ +\t--tag [index 1]... (page [page]) (item [item]): affine la recherche, tag par tag,\n\ +\t\tet affiche si besoin les sous-tags, les histoires ou les infos précises de \n\ +\t\tl'histoire demandée\n\ \t--list ([type]): lister les histoires presentes dans la librairie et leurs IDs\n\ \t--set-source [id] [nouvelle source]: change la source de l'histoire\n\ \t--set-title [id] [nouveau titre]: change le titre de l'histoire\n\ diff --git a/src/be/nikiroo/fanfix/reader/Reader.java b/src/be/nikiroo/fanfix/reader/Reader.java index 59ed024..fa170e4 100644 --- a/src/be/nikiroo/fanfix/reader/Reader.java +++ b/src/be/nikiroo/fanfix/reader/Reader.java @@ -208,19 +208,19 @@ public interface Reader { * the website to search on * @param page * the page of results to show (0 = request the maximum number of - * pages, pages start at 1) + * pages, pages start at 1) * @param item * the item to select (0 = do not select a specific item but show - * all the page, items start at 1) + * all the page, items start at 1) * @param tags - * the tags display names to search for (this is a tag + * the tags indices to search for (this is a tag * hierarchy, NOT a multiple tags choice) * * @throws IOException * in case of I/O error */ public void searchTag(SupportType searchOn, int page, int item, - String... tags) throws IOException; + Integer... tags) throws IOException; /** * Open the {@link Story} with an external reader (the program should be diff --git a/src/be/nikiroo/fanfix/reader/cli/CliReader.java b/src/be/nikiroo/fanfix/reader/cli/CliReader.java index 03cb227..6d98418 100644 --- a/src/be/nikiroo/fanfix/reader/cli/CliReader.java +++ b/src/be/nikiroo/fanfix/reader/cli/CliReader.java @@ -109,23 +109,26 @@ class CliReader extends BasicReader { @Override public void searchTag(SupportType searchOn, int page, int item, - String... tags) throws IOException { + Integer... tags) throws IOException { BasicSearchable search = BasicSearchable.getSearchable(searchOn); List stags = search.getTags(); + String fqnTag = ""; 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; - } + for (Integer tagIndex : tags) { + // ! 1-based index ! + if (tagIndex == null || tagIndex <= 0 | tagIndex > stags.size()) { + throw new IOException("Index out of bounds: " + tagIndex); } + stag = stags.get(tagIndex - 1); if (stag != null) { search.fillTag(stag); stags = stag.getChildren(); + if (!fqnTag.isEmpty()) { + fqnTag += " / "; + } + fqnTag += stag.getName(); } else { stags = new ArrayList(); break; @@ -171,34 +174,12 @@ class CliReader extends BasicReader { } else { SearchableTag subtag = subtags.get(item - 1); - String sp = ""; - if (subtag.getParent() != null) { - List parents = new ArrayList(); - for (SearchableTag parent = subtag.getParent(); parent != null; parent = parent - .getParent()) { - parents.add(parent.getName()); - } - for (String parent : parents) { - if (!sp.isEmpty()) { - sp += " / "; - } - sp += parent; - } - } - // TODO: i18n String stories = "stories"; String num = StringUtils.formatNumber(subtag .getCount()); - if (sp.isEmpty()) { - System.out.println(String.format( - "%d/%d: %s, %s %s", page, item, - subtag.getName(), num, stories)); - } else { - System.out.println(String.format( - "%d/%d: %s (%s), %s %s", page, item, - subtag.getName(), sp, num, stories)); - } + System.out.println(String.format("%s (%s), %s %s", + subtag.getName(), fqnTag, num, stories)); } } else { System.out.println("Invalid item: only " + count @@ -206,13 +187,18 @@ class CliReader extends BasicReader { } } else { if (metas != null) { - int i = 0; + // TODO i18n + System.out.println(String.format("Content of %s: ", + fqnTag)); + int i = 1; for (MetaData meta : metas) { - System.out - .println((i + 1) + ": " + meta.getTitle()); + System.out.println(i + ": " + meta.getTitle()); i++; } } else { + // TODO i18n + System.out.println(String.format("Subtags of %s: ", + fqnTag)); int i = 1; for (SearchableTag subtag : subtags) { String total = ""; @@ -235,8 +221,12 @@ class CliReader extends BasicReader { } } } else { + // TODO i18n + System.out.println("Known tags: "); + int i = 1; for (SearchableTag s : stags) { - System.out.println(s.getName()); + System.out.println(String.format("%d: %s", i, s.getName())); + i++; } } } diff --git a/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java b/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java index 177c12a..85b1abc 100644 --- a/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java +++ b/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java @@ -125,14 +125,15 @@ class TuiReaderApplication extends TApplication implements Reader { public void setChapter(int chapter) { reader.setChapter(chapter); } - + @Override - public void search(SupportType searchOn, String keywords, int page, int item) { - reader.search(searchOn, keywords, page,item); + public void search(SupportType searchOn, String keywords, int page, int item) throws IOException { + reader.search(searchOn, keywords, page, item); } - + @Override - public void searchTag(SupportType searchOn, int page, int item, String... tags) { + public void searchTag(SupportType searchOn, int page, int item, + Integer... tags) throws IOException { reader.searchTag(searchOn, page, item, tags); } -- 2.27.0