diff --git a/.gitignore b/.gitignore
index c3f95da..d88c825 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,13 @@
-books/*
+app/books/*
*.json
*.pyc
-content.opf
+app/content.opf
.vscode
-data/catalogue.db
+app/data/catalogue.db
+GPATH
+GRTAGS
+GTAGS
+.#*
# Standard Python gitignore below
# Created by https://www.gitignore.io/api/python
diff --git a/README.md b/README.md
index ba8a6b7..951f42b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# pyShelf
+# pyShelf 0.1.0
A simple terminal based ebook server
Frustrated with Calibre being my only option for hosting my eBook collection, I have decided to spin up my own.
@@ -12,17 +12,24 @@ Thus I am creating pyShelf and I hope to be able to provide all the functionalit
I am open to and hoping for community help in the design and execution of this program.
## Development
+
pyShelf uses [`pre-commit`](https://pre-commit.com/) to automate some tasks.
Before developing, run `pre-commit install`.
See the [documentation](https://pre-commit.com/) for more information.
+pyShelf uses ['Doxygen'](https://http://www.doxygen.nl/) for source code documentation.
+Any changes to source should be documented and have run doxygen doxygen.conf prior to commiting.
+
+pyShelf follows ['sem-ver'](https://semver.org) standards. Before advancing version numbers be sure to set PROJECT_NUMBER in doxygen.conf accordingly.
+
## Configuration
All configuration is done in config.py.
The only currently required configuration is to set book_path to the location of your books.
## Current Features
Currently pyShelf will recursively scan your collection, extract and store some metadata in the sqlite database.
-The basic template system is in place, as well as a template mockup. This can be seen hosted on port 8000
+
+Django is being implemented to power the frontend experience, and web based database maintenance. The first steps of which are included in this commit. Also the book database has been switched over to reflect this.
## Future Goals
* HTML Frontend for file transfers
diff --git a/__init__.py b/app/__init__.py
similarity index 100%
rename from __init__.py
rename to app/__init__.py
diff --git a/config.py b/app/config.py
similarity index 75%
rename from config.py
rename to app/config.py
index f5c146f..b4200e7 100755
--- a/config.py
+++ b/app/config.py
@@ -4,7 +4,8 @@ class Config:
self.book_path = "books/"
self.TITLE = "pyShelf E-Book Server"
self.book_shelf = "data/shelf.json"
- self.catalogue_db = "data/catalogue.db"
+ # self.catalogue_db = "data/catalogue.db"
+ self.catalogue_db = "../frontend/db.sqlite3"
self.file_array = [
self.book_shelf,
self.catalogue_db,
diff --git a/lib/__init__.py b/app/lib/__init__.py
similarity index 100%
rename from lib/__init__.py
rename to app/lib/__init__.py
diff --git a/lib/api_hooks.py b/app/lib/api_hooks.py
similarity index 100%
rename from lib/api_hooks.py
rename to app/lib/api_hooks.py
diff --git a/lib/display.py b/app/lib/display.py
similarity index 100%
rename from lib/display.py
rename to app/lib/display.py
diff --git a/lib/library.py b/app/lib/library.py
similarity index 100%
rename from lib/library.py
rename to app/lib/library.py
diff --git a/lib/pyShelf.py b/app/lib/pyShelf.py
similarity index 100%
rename from lib/pyShelf.py
rename to app/lib/pyShelf.py
diff --git a/lib/storage.py b/app/lib/storage.py
similarity index 100%
rename from lib/storage.py
rename to app/lib/storage.py
diff --git a/main.py b/app/main.py
similarity index 97%
rename from main.py
rename to app/main.py
index 7ee3fd1..8011fb7 100755
--- a/main.py
+++ b/app/main.py
@@ -15,7 +15,7 @@ UI = Frontend()
Server = BookServer()
# new_books = Catalogue.new_files()
Catalogue.import_books() # Filter Your books
-Server.run()
+# Server.run()
# TODO Figure out a system to get books page count
# TODO Update Documentation
# TODO Requirements.txt
diff --git a/app/pyproject.toml b/app/pyproject.toml
new file mode 100644
index 0000000..31ec3a3
--- /dev/null
+++ b/app/pyproject.toml
@@ -0,0 +1,10 @@
+[tool.isort]
+force_grid_wrap = 0
+include_trailing_comma = true
+line_length = 88
+multi_line_output = 3
+use_parentheses = true
+# NOTE: the known_third_party setting is managed by
+# seed-isort-config and should not be modified directly.
+# Any changes made to this setting will be overwritten.
+known_third_party = ["PIL", "bs4", "requests"]
diff --git a/static/css/main.css b/app/static/css/main.css
similarity index 100%
rename from static/css/main.css
rename to app/static/css/main.css
diff --git a/static/img/py.png b/app/static/img/py.png
similarity index 100%
rename from static/img/py.png
rename to app/static/img/py.png
diff --git a/static/img/shelf.png b/app/static/img/shelf.png
similarity index 100%
rename from static/img/shelf.png
rename to app/static/img/shelf.png
diff --git a/static/index.html b/app/static/index.html
similarity index 100%
rename from static/index.html
rename to app/static/index.html
diff --git a/data/shelf.json b/data/shelf.json
deleted file mode 100644
index 5efa207..0000000
--- a/data/shelf.json
+++ /dev/null
@@ -1 +0,0 @@
-{"/home/raelon/Projects/pyShelf/books/Python Tricks by Dan Bader.epub": {"files": ["content.opf", "media/cover-6x9.png", "cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/Python Tricks by Dan Bader.epub"}, "/home/raelon/Projects/pyShelf/books/Automate the Boring Stuff with Python - Practical Programming for Total Beginners - 1st Edition (2015) (Pdf, Epub & Mobi) Gooner/Automate the Boring Stuff with Python (2015).epub": {"files": ["OEBPS/content.opf", "OEBPS/Images/cover00710.jpeg", "OEBPS/Text/cover_page.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/Automate the Boring Stuff with Python - Practical Programming for Total Beginners - 1st Edition (2015) (Pdf, Epub & Mobi) Gooner/Automate the Boring Stuff with Python (2015).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 1 - Hunters of Dune.epub": {"files": ["OPS/xhtml/cover.html", "OPS/9780765312921.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 1 - Hunters of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 2 - The Sandworms of Dune.epub": {"files": ["OPS/package.opf", "OPS/xhtml/cover.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 2 - The Sandworms of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 1 - Sisterhood of Dune.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 1 - Sisterhood of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2 - Mentats of Dune.epub": {"files": ["OEBPS/content.opf", "OEBPS/Images/cover.jpeg"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2 - Mentats of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2.5 - Red Plague.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2.5 - Red Plague.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 3 - Navigators of Dune.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 3 - Navigators of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 1 - Paul of Dune.epub": {"files": ["OPS/package.opf", "OPS/xhtml/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 1 - Paul of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 2 - The Winds of Dune.epub": {"files": ["OPS/package.opf", "OPS/xhtml/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 2 - The Winds of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/1 - Dune - Frank Herbert (1965).epub": {"files": ["OEBPS/package.opf", "OEBPS/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/1 - Dune - Frank Herbert (1965).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/2 - Dune Messiah - Frank Herbert (1969).epub": {"files": ["OEBPS/9780575104426_oeb_opf_r1.opf", "OEBPS/9780575104426_oeb_cover_r1.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/2 - Dune Messiah - Frank Herbert (1969).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/3 - Children of Dune - Frank Herbert (1976).epub": {"files": ["OEBPS/9780575104402_oeb_cover_r1.html", "OEBPS/9780575104402_oeb_opf_r1.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/3 - Children of Dune - Frank Herbert (1976).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/4 - God Emperor Of Dune - Frank Herbert (1981).epub": {"files": ["OEBPS/9780575104440_oeb_opf_r1.opf", "OEBPS/9780575104440_oeb_cover_r1.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/4 - God Emperor Of Dune - Frank Herbert (1981).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/5 - Heretics of Dune - Frank Herbert (1984).epub": {"files": ["OEBPS/9780575104457_oeb_cover_r1.html", "OEBPS/9780575104457_oeb_opf_r1.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/5 - Heretics of Dune - Frank Herbert (1984).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/6 - Chapter House Dune - Frank Herbert (1985).epub": {"files": ["OEBPS/9780575104396_oeb_opf_r1.opf", "OEBPS/9780575104396_oeb_cover_r1.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/6 - Chapter House Dune - Frank Herbert (1985).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 1 - House Atreides.epub": {"files": ["OEBPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 1 - House Atreides.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 2 - House Harkonnen.epub": {"files": ["Herb_9780553897838_epub_opf_r1.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 2 - House Harkonnen.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 3 - House Corrino.epub": {"files": ["OPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 3 - House Corrino.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/CliffsNotes on Herbert's Dune & Other Works - L. David Allen.epub": {"files": ["OPS/images/cover.jpg", "OPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/CliffsNotes on Herbert's Dune & Other Works - L. David Allen.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Dreamer of Dune- The Biography of Frank Herbert by Brian Herbert.epub": {"files": ["OEBPS/content.opf", "OEBPS/Images/cover.jpg"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Dreamer of Dune- The Biography of Frank Herbert by Brian Herbert.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Eye (Short stories) - Frank Herbert.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Eye (Short stories) - Frank Herbert.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Tales of Dune (Short stories) - Brian Herbert and Kevin J. Anderson.epub": {"files": ["OEBPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Tales of Dune (Short stories) - Brian Herbert and Kevin J. Anderson.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/The Road to Dune (Companion book) - Frank Herbert et al.epub": {"files": ["OEBPS/e9781429924917_cover.jpg", "OEBPS/e9781429924917_content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/The Road to Dune (Companion book) - Frank Herbert et al.epub"}}
\ No newline at end of file
diff --git a/docs/html/HTML/D/index.html b/docs/html/HTML/D/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/D/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/FILEMAP b/docs/html/HTML/FILEMAP
new file mode 100644
index 0000000..e69de29
diff --git a/docs/html/HTML/GTAGSROOT b/docs/html/HTML/GTAGSROOT
new file mode 100644
index 0000000..dc5ede3
--- /dev/null
+++ b/docs/html/HTML/GTAGSROOT
@@ -0,0 +1 @@
+/home/raelon/Projects/pyShelf/app
diff --git a/docs/html/HTML/I/index.html b/docs/html/HTML/I/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/I/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/J/index.html b/docs/html/HTML/J/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/J/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/R/index.html b/docs/html/HTML/R/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/R/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/S/index.html b/docs/html/HTML/S/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/S/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/Y/index.html b/docs/html/HTML/Y/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/Y/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/defines.html b/docs/html/HTML/defines.html
new file mode 100644
index 0000000..ff101d5
--- /dev/null
+++ b/docs/html/HTML/defines.html
@@ -0,0 +1,13 @@
+
+
+
+DEFINITIONS
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/HTML/defines/index.html b/docs/html/HTML/defines/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/defines/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/files.html b/docs/html/HTML/files.html
new file mode 100644
index 0000000..a63dd8b
--- /dev/null
+++ b/docs/html/HTML/files.html
@@ -0,0 +1,15 @@
+
+
+
+FILES
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/HTML/files/index.html b/docs/html/HTML/files/index.html
new file mode 100644
index 0000000..f931715
--- /dev/null
+++ b/docs/html/HTML/files/index.html
@@ -0,0 +1 @@
+
diff --git a/docs/html/HTML/help.html b/docs/html/HTML/help.html
new file mode 100644
index 0000000..45bafb4
--- /dev/null
+++ b/docs/html/HTML/help.html
@@ -0,0 +1,24 @@
+
+
+
+HELP
+
+
+
+
+
+
+
+/* [<][>][^][v][top][bottom][index][help] */
+
+[<] Previous definition.
+[>] Next definition.
+[^] First definition in this file.
+[v] Last definition in this file.
+[top] Top of this file.
+[bottom] Bottom of this file.
+[index] Return to index page.
+[help] You are seeing now.
+
+
+
diff --git a/docs/html/HTML/index.html b/docs/html/HTML/index.html
new file mode 100644
index 0000000..c06841c
--- /dev/null
+++ b/docs/html/HTML/index.html
@@ -0,0 +1,28 @@
+
+
+
+pyShelf Open Source Ebook Server-0.1.0
+
+
+
+
+
+
+pyShelf Open Source Ebook Server-0.1.0
+
+Last updated Sun Nov 10 01:10:53 EST 2019
+Powered by
GLOBAL-6.6.3 .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/HTML/mains.html b/docs/html/HTML/mains.html
new file mode 100644
index 0000000..c06841c
--- /dev/null
+++ b/docs/html/HTML/mains.html
@@ -0,0 +1,28 @@
+
+
+
+pyShelf Open Source Ebook Server-0.1.0
+
+
+
+
+
+
+pyShelf Open Source Ebook Server-0.1.0
+
+Last updated Sun Nov 10 01:10:53 EST 2019
+Powered by
GLOBAL-6.6.3 .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/HTML/rebuild.sh b/docs/html/HTML/rebuild.sh
new file mode 100644
index 0000000..26ccd6c
--- /dev/null
+++ b/docs/html/HTML/rebuild.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# rebuild.sh: rebuild hypertext with the previous context.
+#
+# Usage:
+# % sh rebuild.sh
+#
+cd /home/raelon/Projects/pyShelf/app && GTAGSCONF=':skip=HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake,*.o,*.a,*.so,*.lo,*.zip,*.gz,*.bz2,*.xz,*.lzh,*.Z,*.tgz,*.min.js,*min.css:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.hh.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:' htags -g -s -a -n -v -w -t 'pyShelf Open Source Ebook Server-0.1.0' /home/raelon/Projects/pyShelf/docs/html
diff --git a/docs/html/HTML/style.css b/docs/html/HTML/style.css
new file mode 100755
index 0000000..d7db34a
--- /dev/null
+++ b/docs/html/HTML/style.css
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2005, 2010, 2011 Tama Communications Corporation
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+/*
+ * Souce code
+ */
+body { color: #191970; background-color: #f5f5dc; }
+a.visited { color: gray; }
+.title { color: #cc0000; }
+.poweredby { text-align: right; }
+.error { color: red; }
+.loading { color: white; background-color: red; }
+.cvs { font-size: 90%; }
+.caution { text-align: center; margin: 1em 40px; }
+img.icon { vertical-align: top; border: 0; }
+.curline:hover { background-color:lightgray; }
+table.flist { border-spacing: 2px; width: 100%; }
+/*
+ * Parts
+ */
+em { font-style: normal; }
+em.comment { color: green; font-style: italic; }
+em.sharp { color: #8b0000; }
+em.brace { color: red; }
+em.warned { background-color: yellow; }
+em.string { text-decoration: underline; }
+strong.reserved { font-weight: bold; }
+/*
+ * Tag list using table (--table-list)
+ */
+th, td { white-space: nowrap; }
+th.tag { text-align: left; }
+th.line { text-align: right; }
+th.file { text-align: left; }
+th.code { text-align: left; }
+td.tag { text-align: left; }
+td.line { text-align: right; }
+td.file { text-align: left; }
+td.code { text-align: left; }
+/* end of TAG LIST */
+/*
+ * Fixed guide (--fixed-guide)
+ */
+#guide {
+ height: 35px;
+ position: fixed;
+ bottom:0px; left:0px; right:0px;
+ background: #f5f5dc;
+ border: 1px solid #ccc;
+}
+#guide ul {
+ height: 25px;
+ margin: 5px;
+ width: 90%;
+}
+#guide ul li {
+ float: left;
+ display: inline;
+ margin: 1px 1px;
+}
+#guide a {
+ line-height: 24px;
+}
+#guide ul li.standout span {
+ margin: 0px 4px;
+ font-size: 115%;
+ font-weight: bold;
+}
+/* end of FIXED GUIDE */
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
new file mode 100644
index 0000000..e4f6aac
--- /dev/null
+++ b/docs/html/annotated.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Class List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
+
+
+
+
diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png
new file mode 100644
index 0000000..224b29a
Binary files /dev/null and b/docs/html/bc_s.png differ
diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png
new file mode 100644
index 0000000..940a0b9
Binary files /dev/null and b/docs/html/bdwn.png differ
diff --git a/docs/html/classapp_1_1config_1_1Config-members.html b/docs/html/classapp_1_1config_1_1Config-members.html
new file mode 100644
index 0000000..0a78d67
--- /dev/null
+++ b/docs/html/classapp_1_1config_1_1Config-members.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.config.Config , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1config_1_1Config.html b/docs/html/classapp_1_1config_1_1Config.html
new file mode 100644
index 0000000..044db30
--- /dev/null
+++ b/docs/html/classapp_1_1config_1_1Config.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.config.Config Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def __init__ (self)
+
+
+
+
+ book_path
+
+
+ TITLE
+
+
+ book_shelf
+
+
+ catalogue_db
+
+
+ file_array
+
+
+ auto_scan
+
+
+
+
Main System Configuration The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html b/docs/html/classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html
new file mode 100644
index 0000000..be81301
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.api_hooks.DuckDuckGo , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo.html b/docs/html/classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo.html
new file mode 100644
index 0000000..6edec3e
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.api_hooks.DuckDuckGo Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def __init__ (self)
+
+def image_result (self, query)
+
+
+
+
duckduckgo related searching
+
+
◆ image_result()
+
+
+
+
+
+ def app.lib.api_hooks.DuckDuckGo.image_result
+ (
+
+ self ,
+
+
+
+
+
+ query
+
+
+
+ )
+
+
+
+
+
Returns json containing url to image
+:param _key: &t=h_&iar=images&iax=images&ia=images&format=json&pretty=1
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1display_1_1Frontend-members.html b/docs/html/classapp_1_1lib_1_1display_1_1Frontend-members.html
new file mode 100644
index 0000000..dfd3cbc
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1display_1_1Frontend-members.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.display.Frontend , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1display_1_1Frontend.html b/docs/html/classapp_1_1lib_1_1display_1_1Frontend.html
new file mode 100644
index 0000000..e6e3239
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1display_1_1Frontend.html
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.display.Frontend Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ dimensions
+
+
+ TITLE
+
+
+
+
Dynamic frontend display functions
+
+
◆ __init__()
+
+
+
+
+
+ def app.lib.display.Frontend.__init__
+ (
+
+ self ,
+
+
+
+
+
+ dimensions = [0, 0]
+
+
+
+ )
+
+
+
+
+
:param dimensions: array containing screen size [x, y]
+
+
+
+
+
+
◆ app_body()
+
+
+
+
+
+ def app.lib.display.Frontend.app_body
+ (
+
+ self ,
+
+
+
+
+
+ nav ,
+
+
+
+
+
+ shelf
+
+
+
+ )
+
+
+
+
+
Main interface body, and navigation
+:param nav: nav[] system navigation list
+:param shelf: shelf[0{path:"",title:"",cover:"",author:""}]
+:returns _body: HTML render of page body
+
+
+
+
+
◆ app_footer()
+
+
+
+
+
+ def app.lib.display.Frontend.app_footer
+ (
+
+ self )
+
+
+
+
+
Main interface footer; Closes HTML
+:returns _footer: HTML render of page footer
+
+
+
+
+
◆ app_Headers()
+
+
+
+
+
+ def app.lib.display.Frontend.app_Headers
+ (
+
+ self )
+
+
+
+
+
App specific headers
+:returns _head: HTML render of application specific headers
+
+
+
+
+
◆ compile()
+
+
+
+
+
+ def app.lib.display.Frontend.compile
+ (
+
+ self ,
+
+
+
+
+
+ nav ,
+
+
+
+
+
+ shelf
+
+
+
+ )
+
+
+
+
+
Compiles user interface
+:returns _ui: Compiled HTML for page layout
+
+
+
+
+
◆ html_Headers()
+
+
+
+
+
+ def app.lib.display.Frontend.html_Headers
+ (
+
+ self )
+
+
+
+
+
HTML headers
+:returns _head: HTML render of page headers
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1library_1_1Catalogue-members.html b/docs/html/classapp_1_1lib_1_1library_1_1Catalogue-members.html
new file mode 100644
index 0000000..e68e270
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1library_1_1Catalogue-members.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.library.Catalogue , including all inherited members.
+
+ __init__ (self) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ books (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ compare_shelf_current (self) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ cover_regx (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ extract_content (self, book_zip, book) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ extract_cover_html (self, book_zip, book) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ extract_cover_image (self, book_zip, book) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ extract_metadata (self, book)app.lib.library.Catalogue
+ file_list (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ filter_books (self)app.lib.library.Catalogue
+ html_regx (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ import_books (self, list=None) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ opf_regx (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+ process_book (self, book)app.lib.library.Catalogue
+ scan_book (self, book)app.lib.library.Catalogue
+ scan_folder (self, folder=config.book_path) (defined in app.lib.library.Catalogue )app.lib.library.Catalogue
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1library_1_1Catalogue.html b/docs/html/classapp_1_1lib_1_1library_1_1Catalogue.html
new file mode 100644
index 0000000..f1886d7
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1library_1_1Catalogue.html
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.library.Catalogue Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def __init__ (self)
+
+
+def scan_folder (self, folder=config.book_path)
+
+def scan_book (self, book)
+
+def filter_books (self)
+
+def process_book (self, book)
+
+def extract_metadata (self, book)
+
+
+def extract_content (self, book_zip, book)
+
+
+def extract_cover_html (self, book_zip, book)
+
+
+def extract_cover_image (self, book_zip, book)
+
+
+def compare_shelf_current (self)
+
+
+def import_books (self, list=None)
+
+
+
+
+ file_list
+
+
+ opf_regx
+
+
+ cover_regx
+
+
+ html_regx
+
+
+ books
+
+
+
+
Decodes and stores book information Step One: filter_books
+
+
◆ extract_metadata()
+
+
+
+
+
+ def app.lib.library.Catalogue.extract_metadata
+ (
+
+ self ,
+
+
+
+
+
+ book
+
+
+
+ )
+
+
+
+
+
Return extracted metadata and cover picture
+book['path'] == Full path to ebook file
+book['files'] == list of files from self.process_book(book)
+
+
+
+
+
◆ filter_books()
+
+
+
+
+
+ def app.lib.library.Catalogue.filter_books
+ (
+
+ self )
+
+
+
+
+
Scan book folder recursively for epub files
+ filter_books(0) -> Catalogue.books
+ filter_books(1) -> self.books[]
+ :param ret: 0 -> create class property -> dump json
+ :param ret: 1 -> create & return class property
+
+
+
+
+
◆ process_book()
+
+
+
+
+
+ def app.lib.library.Catalogue.process_book
+ (
+
+ self ,
+
+
+
+
+
+ book
+
+
+
+ )
+
+
+
+
+
Return dictionary of epub file contents
+
+
+
+
◆ scan_book()
+
+
+
+
+
+ def app.lib.library.Catalogue.scan_book
+ (
+
+ self ,
+
+
+
+
+
+ book
+
+
+
+ )
+
+
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookDisplay-members.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookDisplay-members.html
new file mode 100644
index 0000000..4553e03
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookDisplay-members.html
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.pyShelf.BookDisplay , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookDisplay.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookDisplay.html
new file mode 100644
index 0000000..e28a867
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookDisplay.html
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.pyShelf.BookDisplay Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ books_per_page
+
+
+ current_page
+
+
+ thumbnail_size
+
+
+ thumbnail_scale
+
+
+ total_pages
+
+
+
+
All functions related to displaying book information in the HTML UI
+
+
◆ __init__()
+
+
+
+
+
+ def app.lib.pyShelf.BookDisplay.__init__
+ (
+
+ self )
+
+
+
+
+
Initialize class variables
+:return: None
+
+
+
+
+
+
◆ booksPerPage()
+
+
+
+
+
+ def app.lib.pyShelf.BookDisplay.booksPerPage
+ (
+
+ self ,
+
+
+
+
+
+ screen_size
+
+
+
+ )
+
+
+
+
+
Set books per page
+
+:param screen_size: Array containing x,y pixel sizes
+:return: self.books_per_page
+
+
+
+
+
◆ nextPage()
+
+
+
+
+
+ def app.lib.pyShelf.BookDisplay.nextPage
+ (
+
+ self )
+
+
+
+
+
Goto next book page
+:return: new current_page
+
+
+
+
+
◆ previousPage()
+
+
+
+
+
+ def app.lib.pyShelf.BookDisplay.previousPage
+ (
+
+ self )
+
+
+
+
+
Goto previous book page
+:return: new current_page
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookServer-members.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookServer-members.html
new file mode 100644
index 0000000..9521817
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookServer-members.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.pyShelf.BookServer , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookServer.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookServer.html
new file mode 100644
index 0000000..98764ae
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1BookServer.html
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.pyShelf.BookServer Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ server_address
+
+
+ handler
+
+
+ httpd
+
+
+
+
HTTP server functions required to display e-books
+
+
+
◆ close()
+
+
+
+
+
+ def app.lib.pyShelf.BookServer.close
+ (
+
+ self )
+
+
+
+
+
+
+
◆ close_prompt()
+
+
+
+
+
+ def app.lib.pyShelf.BookServer.close_prompt
+ (
+
+ self )
+
+
+
+
+
Prompt to close server
+
+
+
+
◆ run()
+
+
+
+
+
+ def app.lib.pyShelf.BookServer.run
+ (
+
+ self )
+
+
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1InitFiles-members.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1InitFiles-members.html
new file mode 100644
index 0000000..82b4f48
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1InitFiles-members.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.pyShelf.InitFiles , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1InitFiles.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1InitFiles.html
new file mode 100644
index 0000000..d0428d4
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1InitFiles.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.pyShelf.InitFiles Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def __init__ (self, file_array)
+
+def CreateFile (self, _pointer)
+
+
+
+
First run file creation operations
+
+
◆ CreateFile()
+
+
+
+
+
+ def app.lib.pyShelf.InitFiles.CreateFile
+ (
+
+ self ,
+
+
+
+
+
+ _pointer
+
+
+
+ )
+
+
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler-members.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler-members.html
new file mode 100644
index 0000000..30532f4
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler-members.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.pyShelf.RequestHandler , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler.html b/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler.html
new file mode 100644
index 0000000..def0079
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler.html
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.pyShelf.RequestHandler Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def do_GET (self)
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler.png b/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler.png
new file mode 100644
index 0000000..1dc1265
Binary files /dev/null and b/docs/html/classapp_1_1lib_1_1pyShelf_1_1RequestHandler.png differ
diff --git a/docs/html/classapp_1_1lib_1_1storage_1_1Storage-members.html b/docs/html/classapp_1_1lib_1_1storage_1_1Storage-members.html
new file mode 100644
index 0000000..130aa15
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1storage_1_1Storage-members.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for app.lib.storage.Storage , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/classapp_1_1lib_1_1storage_1_1Storage.html b/docs/html/classapp_1_1lib_1_1storage_1_1Storage.html
new file mode 100644
index 0000000..5e4c61f
--- /dev/null
+++ b/docs/html/classapp_1_1lib_1_1storage_1_1Storage.html
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app.lib.storage.Storage Class Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def __init__ (self)
+
+def database (self)
+
+def create_tables (self)
+
+def insert_book (self, book)
+
+
+def book_paths_list (self)
+
+
+def commit (self)
+
+
+def close (self)
+
+
+
+
+ db_file
+
+
+ db
+
+
+ cursor
+
+
+
+
Contains all methods for system storage
+
+
◆ create_tables()
+
+
+
+
+
+ def app.lib.storage.Storage.create_tables
+ (
+
+ self )
+
+
+
+
+
Create table structure
+
+
+
+
◆ database()
+
+
+
+
+
+ def app.lib.storage.Storage.database
+ (
+
+ self )
+
+
+
+
+
Create database cursor
+
+
+
+
◆ insert_book()
+
+
+
+
+
+ def app.lib.storage.Storage.insert_book
+ (
+
+ self ,
+
+
+
+
+
+ book
+
+
+
+ )
+
+
+
+
+
Insert book in database
+:returns: True if succeeds False if not
+
+
+
+
The documentation for this class was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/classes.html b/docs/html/classes.html
new file mode 100644
index 0000000..5d9cb4e
--- /dev/null
+++ b/docs/html/classes.html
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Class Index
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/closed.png b/docs/html/closed.png
new file mode 100644
index 0000000..98cc2c9
Binary files /dev/null and b/docs/html/closed.png differ
diff --git a/docs/html/dir_9dc6c7acf21934bbaaf79b41db58c4e7.html b/docs/html/dir_9dc6c7acf21934bbaaf79b41db58c4e7.html
new file mode 100644
index 0000000..6a79080
--- /dev/null
+++ b/docs/html/dir_9dc6c7acf21934bbaaf79b41db58c4e7.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app/lib Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/dir_d422163b96683743ed3963d4aac17747.html b/docs/html/dir_d422163b96683743ed3963d4aac17747.html
new file mode 100644
index 0000000..9672e63
--- /dev/null
+++ b/docs/html/dir_d422163b96683743ed3963d4aac17747.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: app Directory Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/doc.png b/docs/html/doc.png
new file mode 100644
index 0000000..17edabf
Binary files /dev/null and b/docs/html/doc.png differ
diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css
new file mode 100644
index 0000000..47c4fbd
--- /dev/null
+++ b/docs/html/doxygen.css
@@ -0,0 +1,1765 @@
+/* The standard CSS for doxygen 1.8.16 */
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+p.reference, p.definition {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+ul.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+ column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+p.interli {
+}
+
+p.interdd {
+}
+
+p.intertd {
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #FFFFFF;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #FFFFFF;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+ul {
+ overflow: hidden; /*Fixed: list item bullets overlap floating elements*/
+}
+
+#side-nav ul {
+ overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */
+}
+
+#main-nav ul {
+ overflow: visible; /* reset ul rule for the navigation bar drop down lists */
+}
+
+.fragment {
+ text-align: left;
+ direction: ltr;
+ overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/
+ overflow-y: hidden;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
+ margin: 4px 8px 4px 2px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line:after {
+ content:"\000A";
+ white-space: pre;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.ah, span.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #FFFFFF;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl, img.inline {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+blockquote.DocNodeRTL {
+ border-left: 0;
+ border-right: 2px solid #9CAFD4;
+ margin: 0 4px 0 24px;
+ padding: 0 16px 0 12px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+ padding: 8px;
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ margin-bottom: -1px;
+ background-image: url('nav_f.png');
+ background-repeat: repeat-x;
+ background-color: #E2E8F2;
+ line-height: 1.25;
+ font-weight: 300;
+ float:left;
+}
+
+.permalink
+{
+ font-size: 65%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: 400;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-color: #DFE5F1;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+
+}
+
+.overload {
+ font-family: "courier new",courier,monospace;
+ font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype, .tparams .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir, .tparams .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #9CAFD4;
+ border-bottom: 1px solid #9CAFD4;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+.arrow {
+ color: #9CAFD4;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial, Helvetica;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: #728DC1;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+table.directory {
+ font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ font-weight: 400;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+table.classindex
+{
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 3%;
+ margin-right: 3%;
+ width: 94%;
+ border: 0;
+ border-spacing: 0;
+ padding: 0;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+.PageDocRTL-title div.headertitle {
+ text-align: right;
+ direction: rtl;
+}
+
+dl {
+ padding: 0 0 0 0;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */
+dl.section {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.section.DocNodeRTL {
+ margin-right: 0px;
+ padding-right: 0px;
+}
+
+dl.note {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.note.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00D000;
+}
+
+dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #505050;
+}
+
+dl.deprecated.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #505050;
+}
+
+dl.todo {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.todo.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.test.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #C08050;
+}
+
+dl.bug.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.plantumlgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ width: 200px;
+}
+
+.PageDocRTL-title div.toc {
+ float: left !important;
+ text-align: right;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+.PageDocRTL-title div.toc li {
+ background-position-x: right !important;
+ padding-left: 0 !important;
+ padding-right: 10px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.PageDocRTL-title div.toc li.level1 {
+ margin-left: 0 !important;
+ margin-right: 0;
+}
+
+.PageDocRTL-title div.toc li.level2 {
+ margin-left: 0 !important;
+ margin-right: 15px;
+}
+
+.PageDocRTL-title div.toc li.level3 {
+ margin-left: 0 !important;
+ margin-right: 30px;
+}
+
+.PageDocRTL-title div.toc li.level4 {
+ margin-left: 0 !important;
+ margin-right: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: #FFFFFF;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before {
+ border-top-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: #FFFFFF;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: #FFFFFF;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: #FFFFFF;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
+/* @group Markdown */
+
+/*
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTableHead tr {
+}
+
+table.markdownTableBodyLeft td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter {
+ text-align: center
+}
+*/
+
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+ text-align: center
+}
+
+.DocNodeRTL {
+ text-align: right;
+ direction: rtl;
+}
+
+.DocNodeLTR {
+ text-align: left;
+ direction: ltr;
+}
+
+table.DocNodeRTL {
+ width: auto;
+ margin-right: 0;
+ margin-left: auto;
+}
+
+table.DocNodeLTR {
+ width: auto;
+ margin-right: auto;
+ margin-left: 0;
+}
+
+tt, code, kbd, samp
+{
+ display: inline-block;
+ direction:ltr;
+}
+/* @end */
+
+u {
+ text-decoration: underline;
+}
diff --git a/docs/html/doxygen.png b/docs/html/doxygen.png
new file mode 100644
index 0000000..3ff17d8
Binary files /dev/null and b/docs/html/doxygen.png differ
diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js
new file mode 100644
index 0000000..c8e84aa
--- /dev/null
+++ b/docs/html/dynsections.js
@@ -0,0 +1,127 @@
+/*
+ @licstart The following is the entire license notice for the
+ JavaScript code in this file.
+
+ Copyright (C) 1997-2017 by Dimitri van Heesch
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ @licend The above is the entire license notice
+ for the JavaScript code in this file
+ */
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function() {
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: File List
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 1 2 3 ]
+ ▼ app
+ ▼ lib
+ __init__.py
+ api_hooks.py
+ display.py
+ library.py
+ pyShelf.py
+ storage.py
+ __init__.py
+ config.py
+ main.py
+
+
+
+
+
+
+
diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png
new file mode 100644
index 0000000..bb8ab35
Binary files /dev/null and b/docs/html/folderclosed.png differ
diff --git a/docs/html/folderopen.png b/docs/html/folderopen.png
new file mode 100644
index 0000000..d6c7f67
Binary files /dev/null and b/docs/html/folderopen.png differ
diff --git a/docs/html/functions.html b/docs/html/functions.html
new file mode 100644
index 0000000..2236be4
--- /dev/null
+++ b/docs/html/functions.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Class Members
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Here is a list of all documented class members with links to the class documentation for each member:
+
+
+
+
+
diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html
new file mode 100644
index 0000000..89bb656
--- /dev/null
+++ b/docs/html/functions_func.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Class Members - Functions
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html
new file mode 100644
index 0000000..cf3cb18
--- /dev/null
+++ b/docs/html/hierarchy.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
+
+
+
+
diff --git a/docs/html/index.hhc b/docs/html/index.hhc
new file mode 100644
index 0000000..96007e5
--- /dev/null
+++ b/docs/html/index.hhc
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/index.hhk b/docs/html/index.hhk
new file mode 100644
index 0000000..236212b
--- /dev/null
+++ b/docs/html/index.hhk
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/index.hhp b/docs/html/index.hhp
new file mode 100644
index 0000000..16094ac
--- /dev/null
+++ b/docs/html/index.hhp
@@ -0,0 +1,57 @@
+[OPTIONS]
+Compiled file=pyShelf_docs
+Compatibility=1.1
+Full-text search=Yes
+Contents file=index.hhc
+Default Window=main
+Default topic=index.html
+Index file=index.hhk
+Language=0x409 English (United States)
+Binary TOC=YES
+Title=pyShelf Open Source Ebook Server
+
+[WINDOWS]
+main="pyShelf Open Source Ebook Server","index.hhc","index.hhk","index.html","index.html",,,,,0x23520,,0x70387e,,,,,,,,0
+
+[FILES]
+classapp_1_1config_1_1Config.html
+classapp_1_1config_1_1Config-members.html
+classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo.html
+classapp_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html
+classapp_1_1lib_1_1display_1_1Frontend.html
+classapp_1_1lib_1_1display_1_1Frontend-members.html
+classapp_1_1lib_1_1library_1_1Catalogue.html
+classapp_1_1lib_1_1library_1_1Catalogue-members.html
+classapp_1_1lib_1_1pyShelf_1_1BookDisplay.html
+classapp_1_1lib_1_1pyShelf_1_1BookDisplay-members.html
+classapp_1_1lib_1_1pyShelf_1_1BookServer.html
+classapp_1_1lib_1_1pyShelf_1_1BookServer-members.html
+classapp_1_1lib_1_1pyShelf_1_1InitFiles.html
+classapp_1_1lib_1_1pyShelf_1_1InitFiles-members.html
+classapp_1_1lib_1_1pyShelf_1_1RequestHandler.html
+classapp_1_1lib_1_1pyShelf_1_1RequestHandler-members.html
+classapp_1_1lib_1_1storage_1_1Storage.html
+classapp_1_1lib_1_1storage_1_1Storage-members.html
+dir_d422163b96683743ed3963d4aac17747.html
+dir_9dc6c7acf21934bbaaf79b41db58c4e7.html
+index.html
+annotated.html
+classes.html
+hierarchy.html
+functions.html
+functions_func.html
+files.html
+tab_a.png
+tab_b.png
+tab_h.png
+tab_s.png
+nav_h.png
+nav_f.png
+bc_s.png
+doxygen.png
+closed.png
+open.png
+bdwn.png
+sync_on.png
+sync_off.png
+classapp_1_1lib_1_1pyShelf_1_1RequestHandler.png
diff --git a/docs/html/index.html b/docs/html/index.html
new file mode 100644
index 0000000..efb15c9
--- /dev/null
+++ b/docs/html/index.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+pyShelf Open Source Ebook Server: Main Page
+
+
+
+
+
+
+
+
+
+
+
+
+ pyShelf Open Source Ebook Server
+ 0.1.0
+
+ Open source, console based E-book server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/jquery.js b/docs/html/jquery.js
new file mode 100644
index 0000000..4344b33
--- /dev/null
+++ b/docs/html/jquery.js
@@ -0,0 +1,35 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/