weblib: zoomwidth max to 1:1
[fanfix.git] / README.md
index afb1ca65d4ff7d8cacc54c9bd04dd5e0f24e46cf..1ad3339b89830b9d3ed9634b1af94dd6eea4ef9a 100644 (file)
--- a/README.md
+++ b/README.md
-Jexer - Java Text User Interface library
-========================================
+English [Français](README-fr.md)
 
-WARNING: THIS IS ALPHA CODE!  PLEASE CONSIDER FILING BUGS AS YOU
-ENCOUNTER THEM.
+# Fanfix
 
-This library is intended to implement a text-based windowing system
-loosely reminiscient of Borland's [Turbo
-Vision](http://en.wikipedia.org/wiki/Turbo_Vision) library.  For those
-wishing to use the actual C++ Turbo Vision library, see [Sergio
-Sigala's updated version](http://tvision.sourceforge.net/) that runs
-on many more platforms.
+Fanfix is a small Java program that can download stories from some supported websites and render them offline.
 
-Three backends are available:
+## 🔴 This is the command line and server program
 
-* System.in/out to a command-line ECMA-48 / ANSI X3.64 type terminal
-  (tested on Linux + xterm).  I/O is handled through terminal escape
-  sequences generated by the library itself: ncurses is not required
-  or linked to.  xterm mouse tracking using UTF8 and SGR coordinates
-  are supported.  For the demo application, this is the default
-  backend on non-Windows platforms.
+You can also use:
+- the graphical client [Fanfix-swing](https://github.com/nikiroo/fanfix-swing/)
+- the TUI client [Fanfix-jexer](https://github.com/nikiroo/fanfix-jexer/)
 
-* The same command-line ECMA-48 / ANSI X3.64 type terminal as above,
-  but to any general InputStream/OutputStream.  See the file
-  jexer.demos.Demo2 for an example of running the demo over a TCP
-  socket.
+## Synopsis
 
-* Java Swing UI.  This backend can be selected by setting
-  jexer.Swing=true.  The default window size for Swing is 132x40,
-  which is set in jexer.session.SwingSession.  For the demo
-  application, this is the default backend on Windows platforms.
+- ```fanfix``` --import [*URL*]
+- ```fanfix``` --export [*id*] [*output_type*] [*target*]
+- ```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``` --search-tag
+- ```fanfix``` --search-tag [*index 1*]... (page [*page*]) (item [*item*])
+- ```fanfix``` --list
+- ```fanfix``` --server [*key*] [*port*]
+- ```fanfix``` --stop-server [*key*] [*port*]
+- ```fanfix``` --remote [*key*] [*host*] [*port*]
+- ```fanfix``` --help
 
-The demo application showing the existing UI controls can be seen in
-three ways:
+## Description
 
-  * 'java -jar jexer.jar' .  This will use System.in/out on
-    non-Windows, or Swing on Windows.
+(If you are interested in the recent changes, please check the [Changelog](changelog.md) -- note that starting from version 1.4.0, the changelog is checked at startup.)
 
-  * 'java -Djexer.Swing=true -jar jexer.jar' .  This will always use
-    Swing.
+This program will convert from a (supported) URL to an .epub file for stories or a .cbz file for comics (a few other output types are also available, like Plain Text, LaTeX, HTML...).
 
-  * 'java -cp jexer.jar jexer.demos.Demo2 PORT' (where PORT is a
-    number to run the TCP daemon on).  This will use the telnet
-    protocol to establish an 8-bit clean channel and be aware of
-    screen size changes.
+To help organize your stories, it can also work as a local library so you can:
 
-Additional backends can be created by subclassing
-jexer.backend.Backend and passing it into the TApplication
-constructor.
+- Import a story from its URL (or just from a file)
+- Export a story to a file (in any of the supported output types)
+- Display a story from the local library in text format in the console
+- Via [fanfix-swing](https://github.com/nikiroo/fanfix-swing/): Display a story from the local library graphically **by itself** ([fanfix-swing](https://github.com/nikiroo/fanfix-swing/)) or **by calling a native program to handle it** (potentially converted into HTML before hand, so any browser can open it)
 
+### Supported websites
 
+Currently, the following websites are supported:
 
-License
--------
+- http://FimFiction.net/: fan fictions devoted to the My Little Pony show
+- http://Fanfiction.net/: fan fictions of many, many different universes, from TV shows to novels to games
+- http://mangahub.io/: a well filled repository of mangas (English)
+- https://e621.net/: a Furry website supporting comics, including MLP
+- https://sofurry.com/: same thing, but story-oriented
+- https://e-hentai.org/: done upon request (so, feel free to ask for more websites!)
+- http://mangas-lecture-en-ligne.fr/: a website offering a lot of mangas (in French)
 
-This project is licensed LGPL ("GNU Lesser General Public License",
-sometimes called the "Library GPL") version 3 or greater.  You may
-freely use Jexer in both closed source (proprietary) and open source
-applications, however any changes you make to the Jexer code must be
-made available to your users.
+### Support file types
 
-See the file LICENSE for the full license text, which includes both
-the GPL v3 and the LGPL supplemental terms.
+We support a few file types for local story conversion (both as input and as output):
 
+- epub: .epub files created by this program (we do not support "all" .epub files, at least for now)
+- text: local stories encoded in plain text format, with a few specific rules:
+       - the title must be on the first line
+       - the author (preceded by nothing, ```by ``` or ```©```) must be on the second line, possibly with the publication date in parenthesis (i.e., ```By Unknown (3rd October 1998)```)
+       - chapters must be declared with ```Chapter x``` or ```Chapter x: NAME OF THE CHAPTER```, where ```x``` is the chapter number
+       - a description of the story must be given as chapter number 0
+       - a cover image may be present with the same filename as the story, but a .png, .jpeg or .jpg extension
+- info_text: contains the same information as the text format, but with a companion .info file to store some metadata (the .info file is supposed to be created by Fanfix or compatible with it)
+- cbz: .cbz (collection of images) files, preferably created with Fanfix (but any .cbz file is supported, though without most of Fanfix metadata, obviously)
+- html: HTML files that you can open with any browser; note that it will create a directory structure with ```index.html``` as the main file -- we only support importing HTML files created by Fanfix
 
+### Supported platforms
 
-Acknowledgements
-----------------
+Any platform with at lest Java 1.6 on it should be ok.
 
-Jexer makes use of the Terminus TrueType font [made available
-here](http://files.ax86.net/terminus-ttf/) .
+It has been tested on Linux (Debian, Slackware, Ubuntu), MacOS X and Windows for now, but feel free to inform us if you try it on another system.
 
+If you have any problems to compile it with a supported Java version (1.6+), please contact us.
 
+## Options
 
-Usage
------
+You can start the program in two ways:
 
-Usage patterns are still being worked on, but in general the goal will
-be to build applications as follows:
+- ```java -jar fanfix.jar```
+- ```fanfix``` (if you used *make install*)
 
-```Java
-import jexer.*;
+The following arguments are allowed:
 
-public class MyApplication extends TApplication {
+- ```--import [URL]```: import the story at URL into the local library
+- ```--export [id] [output_type] [target]```: export the story denoted by ID to the target file
+- ```--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
+- ```--server [key] [port]```: start a story server on this port
+- ```--stop-server [key] [port]```: stop the remote server running on this port (key must be set to the same value)
+- ```--remote [key] [host] [port]```: contact this server instead of the usual library (key must be set to the same value)
+- ```--help```: display the available options
+- ```--version```: return the version of the program
 
-    public MyApplication() {
-        super(BackendType.SWING); // Could also use BackendType.XTERM
+### Environment
 
-        // Create standard menus for File and Window
-        addFileMenu();
-        addWindowMenu();
-    }
+Some environment variables are recognized by the program:
 
-    public static void main(String [] args) {
-        MyApplication app = new MyApplication();
-        (new Thread(app)).start();
-    }
-}
-```
+- ```LANG=en```: force the language to English
+- ```CONFIG_DIR=$HOME/.fanfix```: use the given directory as a config directory (and copy the default configuration if needed)
+- ```NOUTF=1```: try to fallback to non-unicode values when possible (can have an impact on the resulting files, not only on user messages)
+- ```DEBUG=1```: force the ```DEBUG=true``` option of the configuration file (to show more information on errors)
 
-See the files in jexer.demos for more detailed examples.
+## Compilation
 
+```./configure.sh && make```
 
+You can also import the java sources into, say, [Eclipse](https://eclipse.org/), and create a runnable JAR file from there.
 
-Known Issues / Arbitrary Decisions
-----------------------------------
+There are some unit tests you can run, too:
 
-Some arbitrary design decisions had to be made when either the
-obviously expected behavior did not happen or when a specification was
-ambiguous.  This section describes such issues.
+```./configure.sh && make build test run-test```
 
-  - TTerminalWindow will hang on input from the remote if the
-    TApplication is exited before the TTerminalWindow's process has
-    closed on its own.  This is due to a Java limitation/interaction
-    between blocking reads (which is necessary to get UTF8 translation
-    correct) and file streams.
+If you run the unit tests, note that some flag files can impact them:
 
-  - See jexer.tterminal.ECMA48 for more specifics of terminal
-    emulation limitations.
+- ```test/VERBOSE```      : enable verbose mode
+- ```test/OFFLINE```      : to forbid any downloading
+- ```test/URLS```         : to allow testing URLs
+- ```test/FORCE_REFRESH```: to force a clear of the cache
 
-  - TTerminalWindow uses cmd.exe on Windows.  Output will not be seen
-    until enter is pressed, due to cmd.exe's use of line-oriented
-    input (see the ENABLE_LINE_INPUT flag for GetConsoleMode() and
-    SetConsoleMode()).
+Note that ```test/CACHE``` can be kept, as it will contain all internet related files you need (if you allow URLs, run the test once which will populate the CACHE then go OFFLINE, it will still work).
 
-  - TTerminalWindow launches 'script -fqe /dev/null' on non-Windows
-    platforms.  This is a workaround for the C library behavior of
-    checking for a tty: script launches $SHELL in a pseudo-tty.  This
-    works on Linux but might not on other Posix-y platforms.
+The test files will be:
 
-  - Java's InputStreamReader as used by the ECMA48 backend requires a
-    valid UTF-8 stream.  The default X10 encoding for mouse
-    coordinates outside (160,94) can corrupt that stream, at best
-    putting garbage keyboard events in the input queue but at worst
-    causing the backend reader thread to throw an Exception and exit
-    and make the entire UI unusable.  Mouse support therefore requires
-    a terminal that can deliver either UTF-8 coordinates (1005 mode)
-    or SGR coordinates (1006 mode).  Most modern terminals can do
-    this.
+- ```test/*.url```  : URL to download in text format, content = URL
+- ```test/*.story```: text mode story, content = story
 
-  - jexer.session.TTYSession calls 'stty size' once every second to
-    check the current window size, performing the same function as
-    ioctl(TIOCGWINSZ) but without requiring a native library.
 
-  - jexer.io.ECMA48Terminal calls 'stty' to perform the equivalent of
-    cfmakeraw() when using System.in/out.  System.out is also
-    (blindly!)  put in 'stty sane cooked' mode when exiting.
+### Dependant libraries (included)
 
+Required:
 
+- ```libs/nikiroo-utils-sources.jar```: some shared utility functions
+- [```libs/unbescape-sources.jar```](https://github.com/unbescape/unbescape): a nice library to escape/unescape a lot of text formats; used here for HTML
+- [```libs/jsoup-sources.jar```](https://jsoup.org/): a library to parse HTML
+- [```libs/JSON-java-20190722-sources.jar```](https://github.com/stleary/JSON-java): a library to parse JSON
 
-System Properties
------------------
+Optional:
 
-The following properties control features of Jexer:
+- [```libs/jexer-sources.jar```](https://github.com/klamonte/jexer): a small library that offers TUI widgets
+- [```pandoc```](http://pandoc.org/): to generate the man pages from the README files
 
-  jexer.Swing
-  -----------
+Nothing else but Java 1.6+.
 
-  Used only by jexer.demos.Demo1.  If true, use the Swing interface
-  for the demo application.  Default: true on Windows platforms
-  (os.name starts with "Windows"), false on non-Windows platforms.
+Note that calling ```make libs``` will export the libraries into the src/ directory.
 
-  jexer.Swing.cursorStyle
-  -----------------------
+## Author
 
-  Used by jexer.io.SwingScreen.  Selects the cursor style to draw.
-  Valid values are: underline, block, outline.  Default: underline.
+Fanfix was written by Niki Roo <niki@nikiroo.be>
 
-
-
-Roadmap
--------
-
-Many tasks remain before calling this version 1.0:
-
-0.0.3: FINISH PORTING
-
-0.0.4: NEW STUFF
-
-- Making TMenu keyboard accelerators active/inactive
-- TStatusBar
-- TEditor
-- TWindow
-  - "Smart placement" for new windows
-
-0.0.5: BUG HUNT
-
-- Swing performance.  Even with double buffering it isn't great.
-
-0.1.0: BETA RELEASE
-
-- TSpinner
-- TComboBox
-- TListBox
-- TCalendar
-- TColorPicker
-
-Wishlist features (2.0):
-
-- TTerminal
-  - Handle resize events (pass to child process)
-- Screen
-  - Allow complex characters in putCharXY() and detect them in putStrXY().
-- Drag and drop
-  - TEditor
-  - TField
-  - TText
-  - TTerminal
-  - TComboBox
-
-
-Screenshots
------------
-
-![Several Windows Open Including A Terminal](/screenshots/screenshot1.png?raw=true "Several Windows Open Including A Terminal")
-
-![Yo Dawg...](/screenshots/yodawg.png?raw=true "Yo Dawg, I heard you like text windowing systems, so I ran a text windowing system inside your text windowing system so you can have a terminal in your terminal.")