From 30f60e4ec3e0a1a3dd95a81f5e08d0f3fb3cdf72 Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Tue, 4 Aug 2020 13:18:44 -0400 Subject: [PATCH 01/12] buttons for importBooks, and logout. --- src/interface/static/js/pyshelf_ux.js | 43 +++++++++++++++++++++++---- src/interface/views.py | 2 ++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 008cf3b..33e4116 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -88,11 +88,7 @@ $(document).ready(function(){ window.location.href="/flip_sort/"+$("#_order").val(); }); $('#search_string').html(" "+$('#_search').val().substr(0,15)+""); - $('#pop_over_0').dialog({ autoOpen: false }); - resize_search(); - $(window).resize(resize_search(win_width)); - $('#pop_over_0').on('click', 'div.collection', function(){ window.location.href = '/show_collection/'+$(this).attr('data'); }); @@ -102,7 +98,6 @@ $(document).ready(function(){ $('#pop_over_0').dialog("close"); return; } - customlog(['Login Clicked']); $.ajax({ type: "GET", url: "/live", data: {hook: 'register'}, success: function (response) { @@ -135,8 +130,42 @@ $(document).ready(function(){ }); }); $('#btn_logout').on('click', function() { - window.location.href = '/logout'; + //window.location.href = '/logout'; + var isopen = $('#pop_over_0').dialog("isOpen"); + if (isopen) { + $('#pop_over_0').dialog("close"); + return; + } + $('#pop_over_0').dialog({ + title: "User Controls", + maxHeight: (win_height - 100), + minWidth: $("#horiz_nav_main").width(), + hide: {effect: "blind", duration: 1000}, + show: {effect: "blind", duration: 1000}, + position: { + my: "top", at: "bottom", of: $("#horiz_nav_main") + } + }); + // clear and create a new container + $('#pop_over_0').html('
'); + // Populate the container from response.data + $('#usercp').append('
'); + $('#usercp-inner').append( + '
' + + '' + + '
' + + '
' + + '' + + '
' + ); + $('#usercp-inner').append('
'); + $('#usercp').append('
'); + // Close the container + $('#pop_over').append(''); + // Now open this dialog + $('#pop_over_0').dialog("open"); }); + $('.logout-btn').on('click', function(){window.location.href = '/logout'}); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); if (isopen){ @@ -215,6 +244,8 @@ $(document).ready(function(){ } }); }); + resize_search(); + $(window).resize(resize_search(win_width)); }); function resize_search(win_width){ if (win_width <= 1025){ diff --git a/src/interface/views.py b/src/interface/views.py index 030c70d..4fa3183 100755 --- a/src/interface/views.py +++ b/src/interface/views.py @@ -402,6 +402,8 @@ def live(request, **kwargs): html = render_to_string('signup.html', {'form': SignUpForm}, request) html += render_to_string('login.html', {'form': UserLoginForm}, request) return JsonResponse({"data": html}) + elif hook == "update_books": + print("Update Books") else: return JsonResponse(err_txt, status=404) return JsonResponse({"data": "Response sent"}, status=200) From 5d97c066a9fd346a9dcd47cdcbae5d0bd785aa5a Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Fri, 7 Aug 2020 12:25:33 -0400 Subject: [PATCH 02/12] Added import btn, Catalog overide, started server backend --- Pipfile | 34 ++ Pipfile.lock | 456 ++++++++++++++++++++++++++ src/backend/lib/library.py | 13 +- src/backend/lib/overide.py | 55 ++++ src/backend/lib/pyShelf.py | 71 ++-- src/backend/pyShelf.py | 3 + src/interface/static/js/pyshelf_ux.js | 60 +++- src/interface/views.py | 20 +- uwsgi_params | 16 + 9 files changed, 659 insertions(+), 69 deletions(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 src/backend/lib/overide.py create mode 100755 src/backend/pyShelf.py create mode 100644 uwsgi_params diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..3dae9df --- /dev/null +++ b/Pipfile @@ -0,0 +1,34 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +bs4 = "*" +certifi = "*" +lxml = "*" +requests = "*" +soupsieve = "*" +urllib3 = "*" +urwid = "*" +w3lib = "*" +websockets = "*" +pre-commit = "*" +isort = "*" +toml = "*" +django-debug-toolbar = "*" +psycopg2-binary = "*" +prompt-toolkit = "*" +psutil = "*" +pyfiglet = "*" +mobi-python = "*" +jsonpickle = "*" +django-widget-tweaks = "*" +Pillow = "*" +Django = "*" +uWSGI = "*" + +[requires] +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..ebec91a --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,456 @@ +{ + "_meta": { + "hash": { + "sha256": "28592c8791edd0163c498191c84b83abc005d18135363f381d8b241f990d1eed" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "appdirs": { + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" + }, + "asgiref": { + "hashes": [ + "sha256:7e51911ee147dd685c3c8b805c0ad0cb58d360987b56953878f8c06d2d1c6f1a", + "sha256:9fc6fb5d39b8af147ba40765234fa822b39818b12cc80b35ad9b0cef3a476aed" + ], + "markers": "python_version >= '3.5'", + "version": "==3.2.10" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7", + "sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8", + "sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c" + ], + "version": "==4.9.1" + }, + "bs4": { + "hashes": [ + "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a" + ], + "index": "pypi", + "version": "==0.0.1" + }, + "certifi": { + "hashes": [ + "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", + "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" + ], + "index": "pypi", + "version": "==2020.6.20" + }, + "cfgv": { + "hashes": [ + "sha256:32e43d604bbe7896fe7c248a9c2276447dbef840feb28fe20494f62af110211d", + "sha256:cf22deb93d4bcf92f345a5c3cd39d3d41d6340adc60c78bbbd6588c384fda6a1" + ], + "markers": "python_full_version >= '3.6.1'", + "version": "==3.2.0" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "distlib": { + "hashes": [ + "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb", + "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1" + ], + "version": "==0.3.1" + }, + "django": { + "hashes": [ + "sha256:1a63f5bb6ff4d7c42f62a519edc2adbb37f9b78068a5a862beff858b68e3dc8b", + "sha256:2d390268a13c655c97e0e2ede9d117007996db692c1bb93eabebd4fb7ea7012b" + ], + "index": "pypi", + "version": "==3.1" + }, + "django-debug-toolbar": { + "hashes": [ + "sha256:eabbefe89881bbe4ca7c980ff102e3c35c8e8ad6eb725041f538988f2f39a943", + "sha256:ff94725e7aae74b133d0599b9bf89bd4eb8f5d2c964106e61d11750228c8774c" + ], + "index": "pypi", + "version": "==2.2" + }, + "django-widget-tweaks": { + "hashes": [ + "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489", + "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836" + ], + "index": "pypi", + "version": "==1.4.8" + }, + "filelock": { + "hashes": [ + "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", + "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" + ], + "version": "==3.0.12" + }, + "identify": { + "hashes": [ + "sha256:110ed090fec6bce1aabe3c72d9258a9de82207adeaa5a05cd75c635880312f9a", + "sha256:ccd88716b890ecbe10920659450a635d2d25de499b9a638525a48b48261d989b" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.4.25" + }, + "idna": { + "hashes": [ + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.10" + }, + "importlib-metadata": { + "hashes": [ + "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83", + "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.7.0" + }, + "isort": { + "hashes": [ + "sha256:723de131d9ae9d2561844f0ee525ce33a396a11bcda57174f036ed5ab3d6a122", + "sha256:cdca22530d093ed16983ba52c41560fa0219d1b958e44fd2ae2995dcc7b785be" + ], + "index": "pypi", + "version": "==5.3.0" + }, + "jsonpickle": { + "hashes": [ + "sha256:8919c166bac0574e3d74425c7559434062002d9dfc0ac2afa6dc746ba4a19439", + "sha256:e8d4b7cd0bd6826001a74377df1079a76ad8bae0f909282de2554164c837c8ba" + ], + "index": "pypi", + "version": "==1.4.1" + }, + "lxml": { + "hashes": [ + "sha256:05a444b207901a68a6526948c7cc8f9fe6d6f24c70781488e32fd74ff5996e3f", + "sha256:08fc93257dcfe9542c0a6883a25ba4971d78297f63d7a5a26ffa34861ca78730", + "sha256:107781b213cf7201ec3806555657ccda67b1fccc4261fb889ef7fc56976db81f", + "sha256:121b665b04083a1e85ff1f5243d4a93aa1aaba281bc12ea334d5a187278ceaf1", + "sha256:1fa21263c3aba2b76fd7c45713d4428dbcc7644d73dcf0650e9d344e433741b3", + "sha256:2b30aa2bcff8e958cd85d907d5109820b01ac511eae5b460803430a7404e34d7", + "sha256:4b4a111bcf4b9c948e020fd207f915c24a6de3f1adc7682a2d92660eb4e84f1a", + "sha256:5591c4164755778e29e69b86e425880f852464a21c7bb53c7ea453bbe2633bbe", + "sha256:59daa84aef650b11bccd18f99f64bfe44b9f14a08a28259959d33676554065a1", + "sha256:5a9c8d11aa2c8f8b6043d845927a51eb9102eb558e3f936df494e96393f5fd3e", + "sha256:5dd20538a60c4cc9a077d3b715bb42307239fcd25ef1ca7286775f95e9e9a46d", + "sha256:74f48ec98430e06c1fa8949b49ebdd8d27ceb9df8d3d1c92e1fdc2773f003f20", + "sha256:786aad2aa20de3dbff21aab86b2fb6a7be68064cbbc0219bde414d3a30aa47ae", + "sha256:7ad7906e098ccd30d8f7068030a0b16668ab8aa5cda6fcd5146d8d20cbaa71b5", + "sha256:80a38b188d20c0524fe8959c8ce770a8fdf0e617c6912d23fc97c68301bb9aba", + "sha256:8f0ec6b9b3832e0bd1d57af41f9238ea7709bbd7271f639024f2fc9d3bb01293", + "sha256:92282c83547a9add85ad658143c76a64a8d339028926d7dc1998ca029c88ea6a", + "sha256:94150231f1e90c9595ccc80d7d2006c61f90a5995db82bccbca7944fd457f0f6", + "sha256:9dc9006dcc47e00a8a6a029eb035c8f696ad38e40a27d073a003d7d1443f5d88", + "sha256:a76979f728dd845655026ab991df25d26379a1a8fc1e9e68e25c7eda43004bed", + "sha256:aa8eba3db3d8761db161003e2d0586608092e217151d7458206e243be5a43843", + "sha256:bea760a63ce9bba566c23f726d72b3c0250e2fa2569909e2d83cda1534c79443", + "sha256:c3f511a3c58676147c277eff0224c061dd5a6a8e1373572ac817ac6324f1b1e0", + "sha256:c9d317efde4bafbc1561509bfa8a23c5cab66c44d49ab5b63ff690f5159b2304", + "sha256:cc411ad324a4486b142c41d9b2b6a722c534096963688d879ea6fa8a35028258", + "sha256:cdc13a1682b2a6241080745b1953719e7fe0850b40a5c71ca574f090a1391df6", + "sha256:cfd7c5dd3c35c19cec59c63df9571c67c6d6e5c92e0fe63517920e97f61106d1", + "sha256:e1cacf4796b20865789083252186ce9dc6cc59eca0c2e79cca332bdff24ac481", + "sha256:e70d4e467e243455492f5de463b72151cc400710ac03a0678206a5f27e79ddef", + "sha256:ecc930ae559ea8a43377e8b60ca6f8d61ac532fc57efb915d899de4a67928efd", + "sha256:f161af26f596131b63b236372e4ce40f3167c1b5b5d459b29d2514bd8c9dc9ee" + ], + "index": "pypi", + "version": "==4.5.2" + }, + "mobi-python": { + "hashes": [ + "sha256:010d0ed1933ee9bf33330ac125e55f9cb956078b6e62cbdba59b3bd753f903f3", + "sha256:890a14485ee83f6973f72eb51b6117a6c6da73e52210ea4c41dad9093f1d01b8" + ], + "index": "pypi", + "version": "==0.0.1" + }, + "nodeenv": { + "hashes": [ + "sha256:4b0b77afa3ba9b54f4b6396e60b0c83f59eaeb2d63dc3cc7a70f7f4af96c82bc" + ], + "version": "==1.4.0" + }, + "pillow": { + "hashes": [ + "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", + "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", + "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", + "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", + "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", + "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", + "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", + "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", + "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", + "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", + "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" + ], + "index": "pypi", + "version": "==7.2.0" + }, + "pre-commit": { + "hashes": [ + "sha256:1657663fdd63a321a4a739915d7d03baedd555b25054449090f97bb0cb30a915", + "sha256:e8b1315c585052e729ab7e99dcca5698266bedce9067d21dc909c23e3ceed626" + ], + "index": "pypi", + "version": "==2.6.0" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8", + "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04" + ], + "index": "pypi", + "version": "==3.0.5" + }, + "psutil": { + "hashes": [ + "sha256:0ee3c36428f160d2d8fce3c583a0353e848abb7de9732c50cf3356dd49ad63f8", + "sha256:10512b46c95b02842c225f58fa00385c08fa00c68bac7da2d9a58ebe2c517498", + "sha256:4080869ed93cce662905b029a1770fe89c98787e543fa7347f075ade761b19d6", + "sha256:5e9d0f26d4194479a13d5f4b3798260c20cecf9ac9a461e718eb59ea520a360c", + "sha256:66c18ca7680a31bf16ee22b1d21b6397869dda8059dbdb57d9f27efa6615f195", + "sha256:68d36986ded5dac7c2dcd42f2682af1db80d4bce3faa126a6145c1637e1b559f", + "sha256:90990af1c3c67195c44c9a889184f84f5b2320dce3ee3acbd054e3ba0b4a7beb", + "sha256:a5b120bb3c0c71dfe27551f9da2f3209a8257a178ed6c628a819037a8df487f1", + "sha256:d8a82162f23c53b8525cf5f14a355f5d1eea86fa8edde27287dd3a98399e4fdf", + "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2", + "sha256:ff1977ba1a5f71f89166d5145c3da1cea89a0fdb044075a12c720ee9123ec818" + ], + "index": "pypi", + "version": "==5.7.2" + }, + "psycopg2-binary": { + "hashes": [ + "sha256:008da3ab51adc70a5f1cfbbe5db3a22607ab030eb44bcecf517ad11a0c2b3cac", + "sha256:07cf82c870ec2d2ce94d18e70c13323c89f2f2a2628cbf1feee700630be2519a", + "sha256:08507efbe532029adee21b8d4c999170a83760d38249936038bd0602327029b5", + "sha256:107d9be3b614e52a192719c6bf32e8813030020ea1d1215daa86ded9a24d8b04", + "sha256:17a0ea0b0eabf07035e5e0d520dabc7950aeb15a17c6d36128ba99b2721b25b1", + "sha256:3286541b9d85a340ee4ed42732d15fc1bb441dc500c97243a768154ab8505bb5", + "sha256:3939cf75fc89c5e9ed836e228c4a63604dff95ad19aed2bbf71d5d04c15ed5ce", + "sha256:40abc319f7f26c042a11658bf3dd3b0b3bceccf883ec1c565d5c909a90204434", + "sha256:51f7823f1b087d2020d8e8c9e6687473d3d239ba9afc162d9b2ab6e80b53f9f9", + "sha256:6bb2dd006a46a4a4ce95201f836194eb6a1e863f69ee5bab506673e0ca767057", + "sha256:702f09d8f77dc4794651f650828791af82f7c2efd8c91ae79e3d9fe4bb7d4c98", + "sha256:7036ccf715925251fac969f4da9ad37e4b7e211b1e920860148a10c0de963522", + "sha256:7b832d76cc65c092abd9505cc670c4e3421fd136fb6ea5b94efbe4c146572505", + "sha256:8f74e631b67482d504d7e9cf364071fc5d54c28e79a093ff402d5f8f81e23bfa", + "sha256:930315ac53dc65cbf52ab6b6d27422611f5fb461d763c531db229c7e1af6c0b3", + "sha256:96d3038f5bd061401996614f65d27a4ecb62d843eb4f48e212e6d129171a721f", + "sha256:a20299ee0ea2f9cca494396ac472d6e636745652a64a418b39522c120fd0a0a4", + "sha256:a34826d6465c2e2bbe9d0605f944f19d2480589f89863ed5f091943be27c9de4", + "sha256:a69970ee896e21db4c57e398646af9edc71c003bc52a3cc77fb150240fefd266", + "sha256:b9a8b391c2b0321e0cd7ec6b4cfcc3dd6349347bd1207d48bcb752aa6c553a66", + "sha256:ba13346ff6d3eb2dca0b6fa0d8a9d999eff3dcd9b55f3a890f12b0b6362b2b38", + "sha256:bb0608694a91db1e230b4a314e8ed00ad07ed0c518f9a69b83af2717e31291a3", + "sha256:c8830b7d5f16fd79d39b21e3d94f247219036b29b30c8270314c46bf8b732389", + "sha256:cac918cd7c4c498a60f5d2a61d4f0a6091c2c9490d81bc805c963444032d0dab", + "sha256:cc30cb900f42c8a246e2cb76539d9726f407330bc244ca7729c41a44e8d807fb", + "sha256:ccdc6a87f32b491129ada4b87a43b1895cf2c20fdb7f98ad979647506ffc41b6", + "sha256:d1a8b01f6a964fec702d6b6dac1f91f2b9f9fe41b310cbb16c7ef1fac82df06d", + "sha256:e004db88e5a75e5fdab1620fb9f90c9598c2a195a594225ac4ed2a6f1c23e162", + "sha256:eb2f43ae3037f1ef5e19339c41cf56947021ac892f668765cd65f8ab9814192e", + "sha256:fa466306fcf6b39b8a61d003123d442b23707d635a5cb05ac4e1b62cc79105cd" + ], + "index": "pypi", + "version": "==2.8.5" + }, + "pyfiglet": { + "hashes": [ + "sha256:c6c2321755d09267b438ec7b936825a4910fec696292139e664ca8670e103639", + "sha256:d555bcea17fbeaf70eaefa48bb119352487e629c9b56f30f383e2c62dd67a01c" + ], + "index": "pypi", + "version": "==0.8.post1" + }, + "pytz": { + "hashes": [ + "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", + "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" + ], + "version": "==2020.1" + }, + "pyyaml": { + "hashes": [ + "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", + "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", + "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", + "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", + "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", + "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", + "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", + "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", + "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", + "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", + "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" + ], + "version": "==5.3.1" + }, + "requests": { + "hashes": [ + "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", + "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" + ], + "index": "pypi", + "version": "==2.24.0" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.15.0" + }, + "soupsieve": { + "hashes": [ + "sha256:1634eea42ab371d3d346309b93df7870a88610f0725d47528be902a0d95ecc55", + "sha256:a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232" + ], + "index": "pypi", + "version": "==2.0.1" + }, + "sqlparse": { + "hashes": [ + "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e", + "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.3.1" + }, + "toml": { + "hashes": [ + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + ], + "index": "pypi", + "version": "==0.10.1" + }, + "urllib3": { + "hashes": [ + "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", + "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" + ], + "index": "pypi", + "version": "==1.25.10" + }, + "urwid": { + "hashes": [ + "sha256:7870866e35b00b71b0c9ccdd1281c8e7fac3806d60b9c1075c95dd5dad88d526" + ], + "index": "pypi", + "version": "==2.1.1" + }, + "uwsgi": { + "hashes": [ + "sha256:faa85e053c0b1be4d5585b0858d3a511d2cd10201802e8676060fd0a109e5869" + ], + "index": "pypi", + "version": "==2.0.19.1" + }, + "virtualenv": { + "hashes": [ + "sha256:7b54fd606a1b85f83de49ad8d80dbec08e983a2d2f96685045b262ebc7481ee5", + "sha256:8cd7b2a4850b003a11be2fc213e206419efab41115cc14bca20e69654f2ac08e" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==20.0.30" + }, + "w3lib": { + "hashes": [ + "sha256:0161d55537063e00d95a241663ede3395c4c6d7b777972ba2fd58bbab2001e53", + "sha256:0ad6d0203157d61149fd45aaed2e24f53902989c32fc1dccc2e2bfba371560df" + ], + "index": "pypi", + "version": "==1.22.0" + }, + "wcwidth": { + "hashes": [ + "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", + "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" + ], + "version": "==0.2.5" + }, + "websockets": { + "hashes": [ + "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5", + "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5", + "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308", + "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb", + "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a", + "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c", + "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170", + "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422", + "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8", + "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485", + "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f", + "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8", + "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc", + "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779", + "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989", + "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1", + "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092", + "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824", + "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d", + "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55", + "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36", + "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b" + ], + "index": "pypi", + "version": "==8.1" + }, + "zipp": { + "hashes": [ + "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", + "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" + ], + "markers": "python_version >= '3.6'", + "version": "==3.1.0" + } + }, + "develop": {} +} diff --git a/src/backend/lib/library.py b/src/backend/lib/library.py index 5016513..2f3c8d5 100755 --- a/src/backend/lib/library.py +++ b/src/backend/lib/library.py @@ -51,6 +51,7 @@ class Catalogue: self.file_list.append(self.scan_folder(_path)) else: self.file_list.append(_path) + print(_path+"\n") def filter_books(self): """ @@ -264,18 +265,24 @@ class Catalogue: c = set.difference(a, b) return c - def import_books(self, list=None): + def import_books(self, list=None, **kwargs): """ Main entry point for import operations. Gets a list of new files via compare_shelf_current. Iterates over list and inserts new books into database. """ - # TODO Refactor metadata extraction into process_book \ - # call to more easily handle additional formats + try: + fsocket = kwargs['socket'] + except KeyError: + fsocket = '/dev/null' book_list = self.compare_shelf_current() db = Storage(self.config) for book in book_list: book = self.process_by_filetype(book) + with open(fsocket, 'w') as _socket: + _socket.write(book[0]) + _socket.close() + breakpoint() db.insert_book(book) inserted = db.commit() if inserted is not True: diff --git a/src/backend/lib/overide.py b/src/backend/lib/overide.py new file mode 100644 index 0000000..1a8f6d1 --- /dev/null +++ b/src/backend/lib/overide.py @@ -0,0 +1,55 @@ +from pathlib import Path +from .config import Config +from .storage import Storage +from .library import Catalogue +import asyncio +import os +import websockets + + +class ACatalogue(Catalogue): + """ + Aynchronous overide of library.Catalogue, + : TODO : Complete or discard this overide + """ + def __init__(self): + super().__init__(Config(Paths.cwd().parent)) + + async def scan_folder(self, _path=None): + """ + Scan folder by _path, allows recurisive scanning + """ + if _path is not None: + folder = _path + elif os.path.isdir(str(self.root_dir) + "/" + self.book_folder): + folder = str(self.root_dir) + "/" + self.book_folder + else: + folder = self.book_folder + for f in os.listdir(folder): + _path = os.path.abspath(folder + "/" + f) + if os.path.isdir(_path.strip() + "/"): + self.file_list.append(self.scan_folder(_path)) + else: + self.file_list.append(_path) + await asyncio.sleep(0.001) + print(_path+"\n") + + async def import_books(self, **kwargs): + """ + Async overide of import_books + """ + fsocket = kwargs['socket'] + book_list = self.compare_shelf_current() + db = Storage(self.config) + for book in book_list: + book = self.process_by_filetype(book) + with open(fsocket, 'w') as _socket: + _socket.write(book[0]) + _socket.close() + await db.insert_book(book) + inserted = db.commit() + if inserted is not True: + print(inserted) + if input("Continue ? y/n") == "y": + pass + db.close() diff --git a/src/backend/lib/pyShelf.py b/src/backend/lib/pyShelf.py index d19d3e5..e29d542 100755 --- a/src/backend/lib/pyShelf.py +++ b/src/backend/lib/pyShelf.py @@ -1,13 +1,11 @@ -#!/usr/bin/python +#!/usr/bin/env python3 import os import time - +import asyncio +import websockets from .config import Config from .storage import Storage -# config = Config() -# Storage = Storage() - class InitFiles: """First run file creation operations""" @@ -34,51 +32,24 @@ class InitFiles: f.close() -class BookDisplay: - """All functions related to displaying book information in the HTML UI""" +class Server: + """ + Main Server Container + :TODO: Document this + """ - def __init__(self, **kwargs): - """ - Initialize class variables - :return: None - """ - self.books_per_page = None - self.current_page = 0 - self.thumbnail_size = [200, 300] - self.thumbnail_scale = 1 - self.total_pages = None + def __init__(self): + self.loop = asyncio.get_event_loop() + self.instance = None + + async def entrypoint(self, websocket, path): + _str = await websocket.recv() + greeting = f"{_str}" + await websocket.send(greeting) + + async def start(self): try: - self.screen_size = kwargs["screen_size"] + self.instance = await websockets.serve(self.entrypoint, "localhost", 1337) + return True except Exception: - self.screen_size = [900, 600] - - def nextPage(self): - """ - ## TODO Remove me - Goto next book page - :return: new current_page - """ - self.current_page += 1 - return self.current_page - - def previousPage(self): - """ - ## TODO Remove me - Goto previous book page - :return: new current_page - """ - self.current_page -= 1 - return self.current_page - - def booksPerPage(self, screen_size): - """ - ## TODO Remove me - Set books per page - :param screen_size: Array containing x,y pixel sizes - :return: self.books_per_page - """ - x = (self.thumbnail_size[0] * self.thumbnail_scale) + 10 - y = (self.thumbnail_size[1] * self.thumbnail_scale) + 10 - self.books_per_page = int(self.screen_size[0] // x) * int( - self.screen_size[1] // y - ) + raise diff --git a/src/backend/pyShelf.py b/src/backend/pyShelf.py new file mode 100755 index 0000000..26392e5 --- /dev/null +++ b/src/backend/pyShelf.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 + +import websockets diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 33e4116..b740bcb 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -21,17 +21,17 @@ $(document).ready(function(){ var s_string = "search by Title, Author, Tags, or Collections"; customlog([cmp_height]); $(".search_submit").click(function(){ - var query = $('.nav_search').val(); - console.log(query); - window.location.href = '/search/'+query; + var query = $('.nav_search').val(); + console.log(query); + window.location.href = '/search/'+query; }); $('.nav_search').on('keypress', function (e) { - if(e.which === 13){ - $(this).attr("disabled", "disabled"); - var query = $('.nav_search').val(); - window.location.href = '/search/'+query; - $(this).removeAttr("disabled"); - } + if(e.which === 13){ + $(this).attr("disabled", "disabled"); + var query = $('.nav_search').val(); + window.location.href = '/search/'+query; + $(this).removeAttr("disabled"); + } }); $('.nav_link').on('mouseover', function (e){ var popover_str = $(this).attr('alt'); @@ -59,13 +59,13 @@ $(document).ready(function(){ }); $('.input_box').focusout(function(){ if ($(this).hasClass('nav_search') && $(this).val() == "") { - $(this).attr("value", s_string); + $(this).attr("value", s_string); } if ($(this).attr("id") == "username" && $(this).val() == "") { - $(this).attr("value", u_string); + $(this).attr("value", u_string); } if ($(this).attr("id") == "password" && $(this).val() == "") { - $(this).attr("value", p_string); + $(this).attr("value", p_string); } }); $('#btn_login').on('click', function(){ @@ -130,7 +130,7 @@ $(document).ready(function(){ }); }); $('#btn_logout').on('click', function() { - //window.location.href = '/logout'; + //window.location.href = '/logout'; var isopen = $('#pop_over_0').dialog("isOpen"); if (isopen) { $('#pop_over_0').dialog("close"); @@ -165,7 +165,39 @@ $(document).ready(function(){ // Now open this dialog $('#pop_over_0').dialog("open"); }); - $('.logout-btn').on('click', function(){window.location.href = '/logout'}); + $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); + $(document).on('click', '.import-btn', function(){ + $.ajax({ + type: "GET", url: "/live", data: {hook: 'import_books'}, + success: function (response) { + // Set the dialog title + $('#pop_over_0').dialog({ + title: "User Controls", + maxHeight: (win_height - 100), + minWidth: $("#horiz_nav_main").width(), + hide: {effect: "blind", duration: 1000}, + show: {effect: "blind", duration: 1000}, + position: { + my: "top", at: "bottom", of: $("#horiz_nav_main") + } + }); + // clear and create a new container + $('#pop_over_0').html('
'); + // Populate the container from response.data + $('#usercp').append('
'); + $('#usercp-inner').append(response.data); + $('#usercp-inner').append('
'); + $('#usercp').append('
'); + // Close the container + $('#pop_over').append(''); + // Now open this dialog + $('#pop_over_0').dialog("open"); + }, + error: function (response) { + customlog(["Failure", response]); + } + }); + }); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); if (isopen){ diff --git a/src/interface/views.py b/src/interface/views.py index 4fa3183..ed25eb9 100755 --- a/src/interface/views.py +++ b/src/interface/views.py @@ -1,9 +1,14 @@ import json import os +import time +import asyncio + from base64 import b64decode, b64encode from pathlib import Path from backend.lib.config import Config +from backend.lib.hooks import ACatalogue + from django.conf import settings from django.contrib import auth from django.contrib.auth import authenticate, get_user_model, login, logout @@ -393,17 +398,28 @@ def live(request, **kwargs): if hook == "collection_listing": collections = collections_list() return JsonResponse({"data": collections}, status=200) + elif hook == "details": try: _pk = request.GET['pk'] except KeyError as e: return False book = book_details(Books.objects.get(pk=_pk)) return JsonResponse({"data": book}, status=200) + elif hook == "register": html = render_to_string('signup.html', {'form': SignUpForm}, request) html += render_to_string('login.html', {'form': UserLoginForm}, request) return JsonResponse({"data": html}) - elif hook == "update_books": - print("Update Books") + + elif hook == "import_books": + breakpoint() + filename = "../data/{}-{}.sock".format(request.user.username, time.strftime("%H:%M:%S")) + catalogue = ACatalogue() + async def responder(socket): + await catalogue.import_books(socket=socket) + return JsonResponse({"data": filename}) + asyncio.run(responder(filename)) + + else: return JsonResponse(err_txt, status=404) return JsonResponse({"data": "Response sent"}, status=200) diff --git a/uwsgi_params b/uwsgi_params new file mode 100644 index 0000000..5abf809 --- /dev/null +++ b/uwsgi_params @@ -0,0 +1,16 @@ +uwsgi_param QUERY_STRING $query_string; +uwsgi_param REQUEST_METHOD $request_method; +uwsgi_param CONTENT_TYPE $content_type; +uwsgi_param CONTENT_LENGTH $content_length; + +uwsgi_param REQUEST_URI $request_uri; +uwsgi_param PATH_INFO $document_uri; +uwsgi_param DOCUMENT_ROOT $document_root; +uwsgi_param SERVER_PROTOCOL $server_protocol; +uwsgi_param REQUEST_SCHEME $scheme; +uwsgi_param HTTPS $https if_not_empty; + +uwsgi_param REMOTE_ADDR $remote_addr; +uwsgi_param REMOTE_PORT $remote_port; +uwsgi_param SERVER_PORT $server_port; +uwsgi_param SERVER_NAME $server_name; From f3d9d8160f411f0edd731fc7822db9b63146a537 Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Sat, 8 Aug 2020 10:12:06 -0400 Subject: [PATCH 03/12] Websocket connection established --- Pipfile | 1 + importBooks | 1 - makeCollections | 13 ---- pyShelf.py | 30 ++++++++ src/backend/pyShelf.py | 3 - src/backend/tests/__init__.py | 0 src/backend/tests/library_test.py | 4 +- src/backend/tests/server_test.py | 6 ++ src/frontend/settings.py | 2 +- src/interface/static/css/Pipfile | 12 +++ src/interface/static/css/Pipfile.lock | 99 ++++++++++++++++++++++++ src/interface/static/js/pyshelf_ux.js | 105 +++++++++++++------------- src/interface/views.py | 1 - 13 files changed, 205 insertions(+), 72 deletions(-) delete mode 100755 makeCollections create mode 100644 pyShelf.py delete mode 100755 src/backend/pyShelf.py mode change 100755 => 100644 src/backend/tests/__init__.py create mode 100644 src/backend/tests/server_test.py create mode 100644 src/interface/static/css/Pipfile create mode 100644 src/interface/static/css/Pipfile.lock diff --git a/Pipfile b/Pipfile index 3dae9df..e4b8371 100644 --- a/Pipfile +++ b/Pipfile @@ -29,6 +29,7 @@ django-widget-tweaks = "*" Pillow = "*" Django = "*" uWSGI = "*" +pudb = "*" [requires] python_version = "3.8" diff --git a/importBooks b/importBooks index c3ad6e8..ae8fa8f 100755 --- a/importBooks +++ b/importBooks @@ -1,5 +1,4 @@ #!/usr/bin/env python - import pathlib import sys diff --git a/makeCollections b/makeCollections deleted file mode 100755 index 0e82de7..0000000 --- a/makeCollections +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python - -import pathlib -import sys - -from src.backend.lib.storage import Storage -from src.backend.pyShelf_MakeCollections import MakeCollections - -PRG_PATH = pathlib.Path.cwd() -LIB_PATH = pathlib.Path.joinpath(PRG_PATH, "src", "backend", "lib") -sys.path.insert(0, PRG_PATH) -print("\n") -MakeCollections(PRG_PATH) diff --git a/pyShelf.py b/pyShelf.py new file mode 100644 index 0000000..629d14c --- /dev/null +++ b/pyShelf.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +import asyncio +import websockets +from pathlib import Path +from src.backend.lib.config import Config + +root = Path.cwd() +config = Config(root) + + +async def echo(websocket, path): + async for message in websocket: + if message == "import": + print("message from Con1 >> {}".format(message)) + tx = "ack->{}".format(message) + elif message == "Connection 2": + print("message from Con2 >> {}".format(message)) + tx = "ack->{}".format(message) + elif message == "ping": + print("<<[{}]".format(message)) + tx = pong(message) + await websocket.send(tx) + +def pong(message): + return "pong" + +start_server = websockets.serve(echo, "127.0.0.1", 1337) + +asyncio.get_event_loop().run_until_complete(start_server) +asyncio.get_event_loop().run_forever() diff --git a/src/backend/pyShelf.py b/src/backend/pyShelf.py deleted file mode 100755 index 26392e5..0000000 --- a/src/backend/pyShelf.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python3 - -import websockets diff --git a/src/backend/tests/__init__.py b/src/backend/tests/__init__.py old mode 100755 new mode 100644 diff --git a/src/backend/tests/library_test.py b/src/backend/tests/library_test.py index e2d98a8..7d3ad7f 100755 --- a/src/backend/tests/library_test.py +++ b/src/backend/tests/library_test.py @@ -1,8 +1,8 @@ import json import os -from ..lib.config import Config -from ..lib.library import Catalogue +from .lib.config import Config +from .lib.library import Catalogue class Test_Config(Config): diff --git a/src/backend/tests/server_test.py b/src/backend/tests/server_test.py new file mode 100644 index 0000000..6528ddb --- /dev/null +++ b/src/backend/tests/server_test.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 +from src.backend.lib.pyShelf import Server + +def test_start(): + server = await Server().start() + assert Server().start() is True diff --git a/src/frontend/settings.py b/src/frontend/settings.py index 0cb56e8..6dfdac1 100755 --- a/src/frontend/settings.py +++ b/src/frontend/settings.py @@ -32,7 +32,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = CONFIG.SECRET # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = TEMPLATE_DEBUG = False +DEBUG = TEMPLATE_DEBUG = True if DEBUG is True: from pudb.remote import set_trace ALLOWED_HOSTS = CONFIG.allowed_hosts diff --git a/src/interface/static/css/Pipfile b/src/interface/static/css/Pipfile new file mode 100644 index 0000000..dc224db --- /dev/null +++ b/src/interface/static/css/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +pytest = "*" + +[requires] +python_version = "3.8" diff --git a/src/interface/static/css/Pipfile.lock b/src/interface/static/css/Pipfile.lock new file mode 100644 index 0000000..3adb209 --- /dev/null +++ b/src/interface/static/css/Pipfile.lock @@ -0,0 +1,99 @@ +{ + "_meta": { + "hash": { + "sha256": "976a2ca0f737f325f408ba96dbdd2082722d52709e42df5c38f7096e58a834da" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "attrs": { + "hashes": [ + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==19.3.0" + }, + "iniconfig": { + "hashes": [ + "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437", + "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69" + ], + "version": "==1.0.1" + }, + "more-itertools": { + "hashes": [ + "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", + "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" + ], + "markers": "python_version >= '3.5'", + "version": "==8.4.0" + }, + "packaging": { + "hashes": [ + "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", + "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==20.4" + }, + "pluggy": { + "hashes": [ + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.13.1" + }, + "py": { + "hashes": [ + "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", + "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.9.0" + }, + "pyparsing": { + "hashes": [ + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.4.7" + }, + "pytest": { + "hashes": [ + "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4", + "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad" + ], + "index": "pypi", + "version": "==6.0.1" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.15.0" + }, + "toml": { + "hashes": [ + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + ], + "version": "==0.10.1" + } + }, + "develop": {} +} diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index b740bcb..65fdcd8 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -6,19 +6,24 @@ $(document).ready(function(){ }; }; /* Initialize ui variables */ - var outstream = []; // put customlog messages here - var win_height = window.innerHeight; // Get the displays height - var win_width = window.innerWidth; // Get the displays width - var scr_height = window.outerHeight; - var scr_width = window.outerWidth; - var hdr_height = $('.app_hdr').height(); // Get our header height - var ftr_height = $('.app_footer').height(); // Get our footer height - var nav_width = $('.nav_l').width(); // Get the width of our nav items - var cmp_height = window.screen.availHeight; - var max_height = win_height - (hdr_height + ftr_height) - (scr_height - win_height); // Set our available height - var u_string = "Username"; - var p_string = "Password"; - var s_string = "search by Title, Author, Tags, or Collections"; + let outstream = []; // put customlog messages here + let win_height = window.innerHeight; // Get the displays height + let win_width = window.innerWidth; // Get the displays width + let scr_height = window.outerHeight; + let scr_width = window.outerWidth; + let hdr_height = $('.app_hdr').height(); // Get our header height + let ftr_height = $('.app_footer').height(); // Get our footer height + let nav_width = $('.nav_l').width(); // Get the width of our nav items + let cmp_height = window.screen.availHeight; + let max_height = win_height - (hdr_height + ftr_height) - (scr_height - win_height); // Set our available height + const u_string = "Username"; + const p_string = "Password"; + const s_string = "search by Title, Author, Tags, or Collections"; + const popover = $('#pop_over_0') + const navlink = $('.nav_link') + const inputbox = $('input_box') + const loginbtn = $('#btn_login') + const server = ('ws://127.0.0.1:1337') customlog([cmp_height]); $(".search_submit").click(function(){ var query = $('.nav_search').val(); @@ -33,7 +38,7 @@ $(document).ready(function(){ $(this).removeAttr("disabled"); } }); - $('.nav_link').on('mouseover', function (e){ + $(navlink).on('mouseover', function (e){ var popover_str = $(this).attr('alt'); x = $(this).offset().left; y = $(this).offset().to; @@ -42,7 +47,7 @@ $(document).ready(function(){ $('.popover').css('top', y); $('.popover').css('display','flex'); }); - $('.nav_link').on('mouseout', function (e){ + $(navlink).on('mouseout', function (e){ var popover_str = $(this).attr('alt'); x = $(this).offset().left; y = $(this).offset().top; @@ -54,10 +59,10 @@ $(document).ready(function(){ $('#btn_collections').on('click', function (e){ $('.hidden.vert-nav.collections').toggle(); }); - $('.input_box').on('click', function(){ + $(inputbox).on('click', function(){ $(this).attr("value",""); }); - $('.input_box').focusout(function(){ + $(inputbox).focusout(function(){ if ($(this).hasClass('nav_search') && $(this).val() == "") { $(this).attr("value", s_string); } @@ -68,7 +73,7 @@ $(document).ready(function(){ $(this).attr("value", p_string); } }); - $('#btn_login').on('click', function(){ + $(loginbtn).on('click', function(){ $('#hdr_nav_login').toggle(); }) $('.favorite_action').on('click', function(){ @@ -88,11 +93,11 @@ $(document).ready(function(){ window.location.href="/flip_sort/"+$("#_order").val(); }); $('#search_string').html(" "+$('#_search').val().substr(0,15)+""); - $('#pop_over_0').dialog({ autoOpen: false }); - $('#pop_over_0').on('click', 'div.collection', function(){ + $(popover).dialog({ autoOpen: false }); + $(popover).on('click', 'div.collection', function(){ window.location.href = '/show_collection/'+$(this).attr('data'); }); - $('#btn_login').on('click', function() { + $(loginbtn).on('click', function() { var isopen = $('#pop_over_0').dialog("isOpen"); if (isopen) { $('#pop_over_0').dialog("close"); @@ -167,36 +172,8 @@ $(document).ready(function(){ }); $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); $(document).on('click', '.import-btn', function(){ - $.ajax({ - type: "GET", url: "/live", data: {hook: 'import_books'}, - success: function (response) { - // Set the dialog title - $('#pop_over_0').dialog({ - title: "User Controls", - maxHeight: (win_height - 100), - minWidth: $("#horiz_nav_main").width(), - hide: {effect: "blind", duration: 1000}, - show: {effect: "blind", duration: 1000}, - position: { - my: "top", at: "bottom", of: $("#horiz_nav_main") - } - }); - // clear and create a new container - $('#pop_over_0').html('
'); - // Populate the container from response.data - $('#usercp').append('
'); - $('#usercp-inner').append(response.data); - $('#usercp-inner').append('
'); - $('#usercp').append('
'); - // Close the container - $('#pop_over').append(''); - // Now open this dialog - $('#pop_over_0').dialog("open"); - }, - error: function (response) { - customlog(["Failure", response]); - } - }); + let socket = PyshelfSocket(server); + ping(socket); }); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); @@ -279,6 +256,7 @@ $(document).ready(function(){ resize_search(); $(window).resize(resize_search(win_width)); }); + function resize_search(win_width){ if (win_width <= 1025){ $('.search_string').attr('size', 20); @@ -290,3 +268,28 @@ function resize_search(win_width){ } } +function PyshelfSocket(address) { + const connection = new WebSocket(address); + connection.onconnect = function(e){ + ping(connection); + }; + connection.onmessage = function(rcvd){ + sock_rx(rcvd) + }; + return connection; +} +function sock_rx(rcvd) { + if (rcvd.data == 'pong') { pong(rcvd.data) } + else { console.log("<<[rx] :"+rcvd.data) } +} +function sock_status(sock) { + let buffered = sock.connection.bufferedAmmount; + let ready = sock.connection.readyState; + return [buffered, ready]; +} +function ping(sock) { + sock.send('ping') +} +function pong(rcvd) { + console.log("<<["+rcvd.data+"] "+rcvd.data) +} diff --git a/src/interface/views.py b/src/interface/views.py index ed25eb9..6117653 100755 --- a/src/interface/views.py +++ b/src/interface/views.py @@ -7,7 +7,6 @@ from base64 import b64decode, b64encode from pathlib import Path from backend.lib.config import Config -from backend.lib.hooks import ACatalogue from django.conf import settings from django.contrib import auth From e0c79ff837d7fe466e639581c02a159eaf4a29e6 Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Sun, 9 Aug 2020 00:17:24 -0400 Subject: [PATCH 04/12] client not waiting connection prior to ping --- src/interface/static/js/pyshelf_ux.js | 39 ++++++++++++++++----------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 65fdcd8..edd0d65 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -172,7 +172,7 @@ $(document).ready(function(){ }); $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); $(document).on('click', '.import-btn', function(){ - let socket = PyshelfSocket(server); + let socket = PyshelfServer(server); ping(socket); }); $('#coll_button').on('click', function(){ @@ -268,27 +268,36 @@ function resize_search(win_width){ } } -function PyshelfSocket(address) { - const connection = new WebSocket(address); - connection.onconnect = function(e){ - ping(connection); - }; - connection.onmessage = function(rcvd){ - sock_rx(rcvd) - }; - return connection; +function OpenSocket(address) { + return new Promise(resolve => { + const connection = new WebSocket(address); + connection.onconnect = function(e){ + + ping(connection); + }; + connection.onmessage = function(rcvd){ + sock_rx(rcvd) + }; + resolve(connection); + }); +} +async function PyshelfServer(address){ + console.log("--[ Starting Connection ]") + connection = await OpenSocket(address); + console.log('--[ Connection Established ]') + return connection } function sock_rx(rcvd) { if (rcvd.data == 'pong') { pong(rcvd.data) } else { console.log("<<[rx] :"+rcvd.data) } } -function sock_status(sock) { - let buffered = sock.connection.bufferedAmmount; - let ready = sock.connection.readyState; +function sock_status(connection) { + let buffered = connection.bufferedAmmount; + let ready = connection.readyState; return [buffered, ready]; } -function ping(sock) { - sock.send('ping') +function ping(connection) { + connection.send('ping') } function pong(rcvd) { console.log("<<["+rcvd.data+"] "+rcvd.data) From fcfb347fbf56526f3163162220f7bfaacd03a8f4 Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Sun, 9 Aug 2020 10:50:14 -0400 Subject: [PATCH 05/12] Ignore Pipfile.lock --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 765a1e4..8495880 100755 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ GRTAGS GTAGS data/shelf.json package-lock.json +Pipfile.lock .#* frontend/interface/migrations/* src/backend/data/*.json From 6f06796cbacf21d098a965b83044973c20021769 Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Sun, 9 Aug 2020 18:33:20 -0400 Subject: [PATCH 06/12] Websocket connection, w bi-directional transport complete --- pyShelf.py | 3 +++ src/interface/static/js/pyshelf_ux.js | 19 +++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pyShelf.py b/pyShelf.py index 629d14c..746756b 100644 --- a/pyShelf.py +++ b/pyShelf.py @@ -21,9 +21,12 @@ async def echo(websocket, path): tx = pong(message) await websocket.send(tx) + def pong(message): + print('Ping Received') return "pong" + start_server = websockets.serve(echo, "127.0.0.1", 1337) asyncio.get_event_loop().run_until_complete(start_server) diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index edd0d65..3f64bc8 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -172,8 +172,8 @@ $(document).ready(function(){ }); $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); $(document).on('click', '.import-btn', function(){ - let socket = PyshelfServer(server); - ping(socket); + let connection = PyshelfServer(server); + //ping(socket); }); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); @@ -271,9 +271,9 @@ function resize_search(win_width){ function OpenSocket(address) { return new Promise(resolve => { const connection = new WebSocket(address); - connection.onconnect = function(e){ - - ping(connection); + connection.onopen = function(e){ + console.log('--[ Connection Established ]') + ping(connection) }; connection.onmessage = function(rcvd){ sock_rx(rcvd) @@ -283,9 +283,7 @@ function OpenSocket(address) { } async function PyshelfServer(address){ console.log("--[ Starting Connection ]") - connection = await OpenSocket(address); - console.log('--[ Connection Established ]') - return connection + return await OpenSocket(address) } function sock_rx(rcvd) { if (rcvd.data == 'pong') { pong(rcvd.data) } @@ -297,8 +295,9 @@ function sock_status(connection) { return [buffered, ready]; } function ping(connection) { - connection.send('ping') + connection.send('ping'); + console.log("[ping]>>"); } function pong(rcvd) { - console.log("<<["+rcvd.data+"] "+rcvd.data) + console.log("<<["+rcvd+"]") } From 3f99c15038dd0037c9c696293bf26e7e1e4b92ab Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Mon, 10 Aug 2020 13:19:35 -0400 Subject: [PATCH 07/12] A most inelegant hack. --- pyShelf.py | 3 +++ src/interface/static/js/pyshelf_ux.js | 24 ++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/pyShelf.py b/pyShelf.py index 746756b..e9daae7 100644 --- a/pyShelf.py +++ b/pyShelf.py @@ -19,6 +19,9 @@ async def echo(websocket, path): elif message == "ping": print("<<[{}]".format(message)) tx = pong(message) + elif message == "importBooks": + print("<<[{} cmd rcvd]\n Starting import".format(message)) + tx = "Starting Import . . ." await websocket.send(tx) diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 3f64bc8..3a85cbe 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -171,9 +171,8 @@ $(document).ready(function(){ $('#pop_over_0').dialog("open"); }); $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); - $(document).on('click', '.import-btn', function(){ - let connection = PyshelfServer(server); - //ping(socket); + $(document).on('click', '.import-btn', async function(){ + let connection = await ImportBooks(server); }); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); @@ -281,14 +280,31 @@ function OpenSocket(address) { resolve(connection); }); } + +function ImportBooks(address) { + return new Promise(resolve => { + const connection = new WebSocket(address); + connection.onopen = function(e){ + sock_tx(connection,'importBooks') + }; + connection.onmessage = function(rcvd){ + sock_rx(rcvd) + }; + resolve(connection); + }); +} + async function PyshelfServer(address){ console.log("--[ Starting Connection ]") return await OpenSocket(address) } function sock_rx(rcvd) { - if (rcvd.data == 'pong') { pong(rcvd.data) } + if (rcvd.data == 'pong') { pong(rcvd) } else { console.log("<<[rx] :"+rcvd.data) } } +function sock_tx(connection, msg) { + connection.send(msg); +} function sock_status(connection) { let buffered = connection.bufferedAmmount; let ready = connection.readyState; From 5429b7ee0008bf8c591605f35ee5bb532e2fd940 Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Sat, 15 Aug 2020 01:09:28 -0400 Subject: [PATCH 08/12] Import Books now working in ui, Working on logging. --- Pipfile | 1 + pyShelf.py | 23 +++++++++++++++++++++-- requirements.txt | 1 + src/backend/lib/config.py | 15 ++++++++++----- src/backend/lib/library.py | 4 ++-- src/frontend/settings.py | 2 +- src/interface/static/css/main.css | 10 ++++++++++ src/interface/static/css/main.scss | 8 ++++++++ src/interface/static/js/pyshelf_ux.js | 16 ++++++++++++++++ 9 files changed, 70 insertions(+), 10 deletions(-) diff --git a/Pipfile b/Pipfile index e4b8371..fe86960 100644 --- a/Pipfile +++ b/Pipfile @@ -30,6 +30,7 @@ Pillow = "*" Django = "*" uWSGI = "*" pudb = "*" +loguru = "*" [requires] python_version = "3.8" diff --git a/pyShelf.py b/pyShelf.py index e9daae7..f6f61e2 100644 --- a/pyShelf.py +++ b/pyShelf.py @@ -1,14 +1,29 @@ #!/usr/bin/env python3 import asyncio import websockets +import sys from pathlib import Path +from loguru import logger from src.backend.lib.config import Config +from src.backend.pyShelf_ScanLibrary import execute_scan +from src.backend.pyShelf_MakeCollections import MakeCollections + root = Path.cwd() config = Config(root) +PRG_PATH = Path.cwd().__str__() +sys.path.insert(0, PRG_PATH) + +tx = None -async def echo(websocket, path): +async def runImport(): + execute_scan(PRG_PATH) + MakeCollections(PRG_PATH) + return "Import Complete" + + +async def socketio(websocket, path): async for message in websocket: if message == "import": print("message from Con1 >> {}".format(message)) @@ -22,6 +37,10 @@ async def echo(websocket, path): elif message == "importBooks": print("<<[{} cmd rcvd]\n Starting import".format(message)) tx = "Starting Import . . ." + await websocket.send(tx) + await runImport() + tx = "complete" + await websocket.send(tx) @@ -30,7 +49,7 @@ def pong(message): return "pong" -start_server = websockets.serve(echo, "127.0.0.1", 1337) +start_server = websockets.serve(socketio, "127.0.0.1", 1337) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() diff --git a/requirements.txt b/requirements.txt index c14ff50..eaa8f3e 100755 --- a/requirements.txt +++ b/requirements.txt @@ -21,3 +21,4 @@ mobi-python uwsgi jsonpickle django-widget-tweaks +loguru diff --git a/src/backend/lib/config.py b/src/backend/lib/config.py index dfa3636..69acc6a 100755 --- a/src/backend/lib/config.py +++ b/src/backend/lib/config.py @@ -1,7 +1,6 @@ import json -import os import pathlib -import sys +from loguru import logger class Config: @@ -17,6 +16,8 @@ class Config: """ _cp = pathlib.Path.joinpath(root, self._fp) _data = self.open_file(_cp) + self.root = root + self.logger = self.get_logger() self.book_path = _data["BOOKPATH"] self.TITLE = _data["TITLE"] self.VERSION = _data["VERSION"] @@ -30,7 +31,6 @@ class Config: self.file_array = [ self.book_shelf, ] - self.root = root self.auto_scan = True self.allowed_hosts = _data["ALLOWED_HOSTS"] @@ -38,7 +38,13 @@ class Config: self.db_pass = _data["PASSWORD"] self.SECRET = _data["SECRET"] - def open_file(self, _cp): + def get_logger(self): + _logger = logger + _logger.add(pathlib.PurePath(self.root, 'data','pyShelf_{time}.log'), rotation="10 MB", loop=None) + return _logger + + @staticmethod + def open_file(_cp): """ Opens config.json and reads in configuration options """ @@ -48,4 +54,3 @@ class Config: def django_secret(self, _data): pass - diff --git a/src/backend/lib/library.py b/src/backend/lib/library.py index 2f3c8d5..353809f 100755 --- a/src/backend/lib/library.py +++ b/src/backend/lib/library.py @@ -13,7 +13,6 @@ from .api_hooks import DuckDuckGo from .config import Config from .storage import Storage -# config = Config() class Catalogue: @@ -51,6 +50,7 @@ class Catalogue: self.file_list.append(self.scan_folder(_path)) else: self.file_list.append(_path) + self.config.logger.info(_path) print(_path+"\n") def filter_books(self): @@ -73,6 +73,7 @@ class Catalogue: """ def process_by_filetype(self, book): + print(str(book), end='\r', flush=True) if book.endswith(".epub"): epub = self.process_epub(book) @@ -282,7 +283,6 @@ class Catalogue: with open(fsocket, 'w') as _socket: _socket.write(book[0]) _socket.close() - breakpoint() db.insert_book(book) inserted = db.commit() if inserted is not True: diff --git a/src/frontend/settings.py b/src/frontend/settings.py index 6dfdac1..0cb56e8 100755 --- a/src/frontend/settings.py +++ b/src/frontend/settings.py @@ -32,7 +32,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = CONFIG.SECRET # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = TEMPLATE_DEBUG = True +DEBUG = TEMPLATE_DEBUG = False if DEBUG is True: from pudb.remote import set_trace ALLOWED_HOSTS = CONFIG.allowed_hosts diff --git a/src/interface/static/css/main.css b/src/interface/static/css/main.css index 0e2d542..8e33bba 100644 --- a/src/interface/static/css/main.css +++ b/src/interface/static/css/main.css @@ -10758,4 +10758,14 @@ a.nav_link { .collection { cursor: pointer; +} + +.progressbar { + ui-progressbar: "ui-corner-all"; + ui-progressbar-complete: "ui-corner-right"; + ui-progressbar-value: "ui-corner-left"; +} + +.progress_container { + min-width: 300px !important; } \ No newline at end of file diff --git a/src/interface/static/css/main.scss b/src/interface/static/css/main.scss index d13398c..8bc025d 100755 --- a/src/interface/static/css/main.scss +++ b/src/interface/static/css/main.scss @@ -621,3 +621,11 @@ a.nav_link { .collection{ cursor: pointer; } +.progressbar{ + ui-progressbar: "ui-corner-all"; + ui-progressbar-complete: "ui-corner-right"; + ui-progressbar-value: "ui-corner-left"; +} +.progress_container{ + min-width: 300px !important; +} diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 3a85cbe..dd714f1 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -173,6 +173,17 @@ $(document).ready(function(){ $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); $(document).on('click', '.import-btn', async function(){ let connection = await ImportBooks(server); + popover.html('
'); + let psout = $('#psout') + psout.append('
Importing Books
') + psout.append('
') + let i_container = $('.import_progress') + i_container.append('
'); + $('.progressbar').progressbar({ + classes: {"ui-progressbar": "highlight"}, + value: false + }); + $(".progressbar").append("
") }); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); @@ -300,6 +311,11 @@ async function PyshelfServer(address){ } function sock_rx(rcvd) { if (rcvd.data == 'pong') { pong(rcvd) } + else if (rcvd.data == 'complete') { + $('.progressbar').progressbar("option", "value", "True"); + $('.import_status').html('Import Complete') + console.log(rcvd.data) + } else { console.log("<<[rx] :"+rcvd.data) } } function sock_tx(connection, msg) { From 59719c19f2dbf67b76f628c32a598a883658f54f Mon Sep 17 00:00:00 2001 From: th3r00t Date: Tue, 25 Aug 2020 13:56:04 -0400 Subject: [PATCH 09/12] Remvoed docs from repo, devs can generate with doxygen --- docs/html/HTML/D/index.html | 1 - docs/html/HTML/FILEMAP | 0 docs/html/HTML/GTAGSROOT | 1 - docs/html/HTML/I/index.html | 1 - docs/html/HTML/J/index.html | 1 - docs/html/HTML/R/index.html | 1 - docs/html/HTML/S/index.html | 1 - docs/html/HTML/Y/index.html | 1 - docs/html/HTML/defines.html | 13 - docs/html/HTML/defines/index.html | 1 - docs/html/HTML/files.html | 15 - docs/html/HTML/files/index.html | 1 - docs/html/HTML/help.html | 24 - docs/html/HTML/index.html | 28 - docs/html/HTML/mains.html | 28 - docs/html/HTML/rebuild.sh | 8 - docs/html/HTML/style.css | 77 - docs/html/annotated.html | 80 - docs/html/bc_s.png | Bin 676 -> 0 bytes docs/html/bdwn.png | Bin 147 -> 0 bytes docs/html/classes.html | 89 - docs/html/closed.png | Bin 132 -> 0 bytes ..._1_1lib_1_1display_1_1TerminalDisplay.html | 129 -- ..._1lib_1_1pyShelf_1_1InitFiles-members.html | 64 - ...ests_1_1library__test_1_1Test__Config.html | 173 -- ...tests_1_1library__test_1_1Test__Config.png | Bin 853 -> 0 bytes ...nd_1_1lib_1_1config_1_1Config-members.html | 81 - ...ibrary__test_1_1TestCatalogue-members.html | 65 - ...1_1display_1_1TerminalDisplay-members.html | 79 - ...ackend_1_1lib_1_1library_1_1Catalogue.html | 422 ---- ...backend_1_1lib_1_1library_1_1Catalogue.png | Bin 966 -> 0 bytes ...library__test_1_1Test__Config-members.html | 82 - ...1_1config__test_1_1TestConfig-members.html | 66 - ..._1lib_1_1library_1_1Catalogue-members.html | 87 - ...1backend_1_1lib_1_1storage_1_1Storage.html | 223 --- ...lib_1_1pyShelf_1_1BookDisplay-members.html | 72 - ...nd_1_1lib_1_1api__hooks_1_1DuckDuckGo.html | 113 -- ...sts_1_1library__test_1_1TestCatalogue.html | 83 - ...1_1backend_1_1lib_1_1config_1_1Config.html | 203 -- ..._1_1backend_1_1lib_1_1config_1_1Config.png | Bin 858 -> 0 bytes ...ackend_1_1lib_1_1pyShelf_1_1InitFiles.html | 105 - ...kend_1_1lib_1_1pyShelf_1_1BookDisplay.html | 206 -- ..._1_1lib_1_1storage_1_1Storage-members.html | 78 - ...s_1_1library__test_1_1Test__Catalogue.html | 480 ----- ...ts_1_1library__test_1_1Test__Catalogue.png | Bin 962 -> 0 bytes ...rary__test_1_1Test__Catalogue-members.html | 89 - ...b_1_1api__hooks_1_1DuckDuckGo-members.html | 65 - ..._1tests_1_1config__test_1_1TestConfig.html | 86 - .../dir_1c7294442ce83d360610449d04c9d7fc.html | 59 - .../dir_3f615ade772d23cefe5e20dcb18424a2.html | 63 - .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 63 - .../dir_9020577e2da81c4cf5a5554c26431f94.html | 59 - docs/html/doc.png | Bin 746 -> 0 bytes docs/html/doxygen.css | 1730 ----------------- docs/html/doxygen.png | Bin 3779 -> 0 bytes docs/html/dynsections.js | 128 -- docs/html/files.html | 75 - docs/html/folderclosed.png | Bin 616 -> 0 bytes docs/html/folderopen.png | Bin 597 -> 0 bytes docs/html/functions.html | 119 -- docs/html/functions_func.html | 119 -- docs/html/hierarchy.html | 69 - docs/html/index.hhc | 251 --- docs/html/index.hhk | 798 -------- docs/html/index.hhp | 64 - docs/html/index.html | 55 - docs/html/jquery.js | 35 - docs/html/menu.js | 51 - docs/html/menudata.js | 35 - docs/html/nav_f.png | Bin 153 -> 0 bytes docs/html/nav_g.png | Bin 95 -> 0 bytes docs/html/nav_h.png | Bin 98 -> 0 bytes docs/html/open.png | Bin 123 -> 0 bytes docs/html/splitbar.png | Bin 314 -> 0 bytes docs/html/sync_off.png | Bin 853 -> 0 bytes docs/html/sync_on.png | Bin 845 -> 0 bytes docs/html/tab_a.png | Bin 142 -> 0 bytes docs/html/tab_b.png | Bin 169 -> 0 bytes docs/html/tab_h.png | Bin 177 -> 0 bytes docs/html/tab_s.png | Bin 184 -> 0 bytes docs/html/tabs.css | 1 - .../src_backend_lib_api_hooks_DuckDuckGo.3 | 50 - docs/man/man3/src_backend_lib_config_Config.3 | 113 -- .../src_backend_lib_display_TerminalDisplay.3 | 78 - .../man3/src_backend_lib_library_Catalogue.3 | 202 -- .../src_backend_lib_pyShelf_BookDisplay.3 | 107 - .../man3/src_backend_lib_pyShelf_InitFiles.3 | 42 - .../man3/src_backend_lib_storage_Storage.3 | 124 -- ...src_backend_tests_config_test_TestConfig.3 | 35 - ...backend_tests_library_test_TestCatalogue.3 | 32 - ...ackend_tests_library_test_Test_Catalogue.3 | 197 -- ...c_backend_tests_library_test_Test_Config.3 | 94 - docs/warn.log | 151 -- 93 files changed, 8421 deletions(-) delete mode 100644 docs/html/HTML/D/index.html delete mode 100644 docs/html/HTML/FILEMAP delete mode 100644 docs/html/HTML/GTAGSROOT delete mode 100644 docs/html/HTML/I/index.html delete mode 100644 docs/html/HTML/J/index.html delete mode 100644 docs/html/HTML/R/index.html delete mode 100644 docs/html/HTML/S/index.html delete mode 100644 docs/html/HTML/Y/index.html delete mode 100644 docs/html/HTML/defines.html delete mode 100644 docs/html/HTML/defines/index.html delete mode 100644 docs/html/HTML/files.html delete mode 100644 docs/html/HTML/files/index.html delete mode 100644 docs/html/HTML/help.html delete mode 100644 docs/html/HTML/index.html delete mode 100644 docs/html/HTML/mains.html delete mode 100644 docs/html/HTML/rebuild.sh delete mode 100755 docs/html/HTML/style.css delete mode 100755 docs/html/annotated.html delete mode 100755 docs/html/bc_s.png delete mode 100755 docs/html/bdwn.png delete mode 100755 docs/html/classes.html delete mode 100755 docs/html/closed.png delete mode 100755 docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html delete mode 100755 docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html delete mode 100755 docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html delete mode 100755 docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png delete mode 100755 docs/html/d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html delete mode 100755 docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html delete mode 100755 docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html delete mode 100755 docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html delete mode 100755 docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png delete mode 100755 docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html delete mode 100755 docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html delete mode 100755 docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html delete mode 100755 docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html delete mode 100755 docs/html/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html delete mode 100755 docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html delete mode 100755 docs/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html delete mode 100755 docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html delete mode 100755 docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png delete mode 100755 docs/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html delete mode 100755 docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html delete mode 100755 docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html delete mode 100755 docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html delete mode 100755 docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png delete mode 100755 docs/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html delete mode 100755 docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html delete mode 100755 docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html delete mode 100755 docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html delete mode 100755 docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html delete mode 100755 docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html delete mode 100755 docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html delete mode 100755 docs/html/doc.png delete mode 100755 docs/html/doxygen.css delete mode 100755 docs/html/doxygen.png delete mode 100755 docs/html/dynsections.js delete mode 100755 docs/html/files.html delete mode 100755 docs/html/folderclosed.png delete mode 100755 docs/html/folderopen.png delete mode 100755 docs/html/functions.html delete mode 100755 docs/html/functions_func.html delete mode 100755 docs/html/hierarchy.html delete mode 100755 docs/html/index.hhc delete mode 100755 docs/html/index.hhk delete mode 100755 docs/html/index.hhp delete mode 100755 docs/html/index.html delete mode 100755 docs/html/jquery.js delete mode 100755 docs/html/menu.js delete mode 100755 docs/html/menudata.js delete mode 100755 docs/html/nav_f.png delete mode 100755 docs/html/nav_g.png delete mode 100755 docs/html/nav_h.png delete mode 100755 docs/html/open.png delete mode 100755 docs/html/splitbar.png delete mode 100755 docs/html/sync_off.png delete mode 100755 docs/html/sync_on.png delete mode 100755 docs/html/tab_a.png delete mode 100755 docs/html/tab_b.png delete mode 100755 docs/html/tab_h.png delete mode 100755 docs/html/tab_s.png delete mode 100755 docs/html/tabs.css delete mode 100755 docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 delete mode 100755 docs/man/man3/src_backend_lib_config_Config.3 delete mode 100755 docs/man/man3/src_backend_lib_display_TerminalDisplay.3 delete mode 100755 docs/man/man3/src_backend_lib_library_Catalogue.3 delete mode 100755 docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3 delete mode 100755 docs/man/man3/src_backend_lib_pyShelf_InitFiles.3 delete mode 100755 docs/man/man3/src_backend_lib_storage_Storage.3 delete mode 100755 docs/man/man3/src_backend_tests_config_test_TestConfig.3 delete mode 100755 docs/man/man3/src_backend_tests_library_test_TestCatalogue.3 delete mode 100755 docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3 delete mode 100755 docs/man/man3/src_backend_tests_library_test_Test_Config.3 delete mode 100755 docs/warn.log diff --git a/docs/html/HTML/D/index.html b/docs/html/HTML/D/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/D/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/FILEMAP b/docs/html/HTML/FILEMAP deleted file mode 100644 index e69de29..0000000 diff --git a/docs/html/HTML/GTAGSROOT b/docs/html/HTML/GTAGSROOT deleted file mode 100644 index c725022..0000000 --- a/docs/html/HTML/GTAGSROOT +++ /dev/null @@ -1 +0,0 @@ -/home/raelon/Projects/pyShelf/src/backend diff --git a/docs/html/HTML/I/index.html b/docs/html/HTML/I/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/I/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/J/index.html b/docs/html/HTML/J/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/J/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/R/index.html b/docs/html/HTML/R/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/R/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/S/index.html b/docs/html/HTML/S/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/S/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/Y/index.html b/docs/html/HTML/Y/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/Y/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/defines.html b/docs/html/HTML/defines.html deleted file mode 100644 index 12bb5f1..0000000 --- a/docs/html/HTML/defines.html +++ /dev/null @@ -1,13 +0,0 @@ - - - -DEFINITIONS - - - - - - -

DEFINITIONS

- - diff --git a/docs/html/HTML/defines/index.html b/docs/html/HTML/defines/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/defines/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/files.html b/docs/html/HTML/files.html deleted file mode 100644 index 96fffe8..0000000 --- a/docs/html/HTML/files.html +++ /dev/null @@ -1,15 +0,0 @@ - - - -FILES - - - - - - -

FILES

-
    -
- - diff --git a/docs/html/HTML/files/index.html b/docs/html/HTML/files/index.html deleted file mode 100644 index f931715..0000000 --- a/docs/html/HTML/files/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/html/HTML/help.html b/docs/html/HTML/help.html deleted file mode 100644 index 217d2a6..0000000 --- a/docs/html/HTML/help.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -HELP - - - - - - -

Usage of Links

-
/* [<][>][^][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 deleted file mode 100644 index 90ee372..0000000 --- a/docs/html/HTML/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - -pyShelf Open Source Ebook Server-0.6.0 - - - - - - -

pyShelf Open Source Ebook Server-0.6.0

-
-Last updated Mon Aug 03 09:02:53 EDT 2020
-Powered by GLOBAL-6.6.4.
-
-
-

MAINS

-
-
-
-

DEFINITIONS

-
-

FILES

-
    -
-
- - diff --git a/docs/html/HTML/mains.html b/docs/html/HTML/mains.html deleted file mode 100644 index 90ee372..0000000 --- a/docs/html/HTML/mains.html +++ /dev/null @@ -1,28 +0,0 @@ - - - -pyShelf Open Source Ebook Server-0.6.0 - - - - - - -

pyShelf Open Source Ebook Server-0.6.0

-
-Last updated Mon Aug 03 09:02:53 EDT 2020
-Powered by GLOBAL-6.6.4.
-
-
-

MAINS

-
-
-
-

DEFINITIONS

-
-

FILES

-
    -
-
- - diff --git a/docs/html/HTML/rebuild.sh b/docs/html/HTML/rebuild.sh deleted file mode 100644 index 4510cdf..0000000 --- a/docs/html/HTML/rebuild.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# -# rebuild.sh: rebuild hypertext with the previous context. -# -# Usage: -# % sh rebuild.sh -# -cd /home/raelon/Projects/pyShelf/src/backend && GTAGSCONF=':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: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:' htags -g -s -a -n -v -w -t 'pyShelf Open Source Ebook Server-0.6.0' /home/raelon/Projects/pyShelf/docs/html diff --git a/docs/html/HTML/style.css b/docs/html/HTML/style.css deleted file mode 100755 index d7db34a..0000000 --- a/docs/html/HTML/style.css +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 deleted file mode 100755 index cfc0d30..0000000 --- a/docs/html/annotated.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Class List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
-
-
-
Class List
-
-
-
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 12345]
- - - - - - - - - - - - - - - - - - - - - -
 Nsrc
 Nbackend
 Nlib
 Napi_hooks
 CDuckDuckGo
 Nconfig
 CConfig
 Nlibrary
 CCatalogue
 NpyShelf
 CBookDisplay
 CInitFiles
 Nstorage
 CStorage
 Ntests
 Nconfig_test
 CTestConfig
 Nlibrary_test
 CTest_Catalogue
 CTest_Config
 CTestCatalogue
-
-
- - - - diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png deleted file mode 100755 index 224b29aa9847d5a4b3902efd602b7ddf7d33e6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png deleted file mode 100755 index 940a0b950443a0bb1b216ac03c45b8a16c955452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T - - - - - - -pyShelf Open Source Ebook Server: Class Index - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
-
-
-
Class Index
-
-
-
b | c | d | i | s | t
- - - - - - - - - - - - - - - - - - - - - - - - - -
  b  
-
Config (src.backend.lib.config)   
  s  
-
Test_Config (src.backend.tests.library_test)   
  d  
-
TestCatalogue (src.backend.tests.library_test)   
BookDisplay (src.backend.lib.pyShelf)   Storage (src.backend.lib.storage)   TestConfig (src.backend.tests.config_test)   
  c  
-
DuckDuckGo (src.backend.lib.api_hooks)   
  t  
-
  i  
-
Catalogue (src.backend.lib.library)   Test_Catalogue (src.backend.tests.library_test)   
InitFiles (src.backend.lib.pyShelf)   
-
b | c | d | i | s | t
-
- - - - diff --git a/docs/html/closed.png b/docs/html/closed.png deleted file mode 100755 index 98cc2c909da37a6df914fbf67780eebd99c597f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT diff --git a/docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html b/docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html deleted file mode 100755 index d4afe5e..0000000 --- a/docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.display.TerminalDisplay Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.4.1 -
-
Open source, console based E-book server
-
-
- - - - - - - -
-
- -
-
src.backend.lib.display.TerminalDisplay Class Reference
-
-
- - - - - - - - - - - - - - - - -

-Public Member Functions

-def __init__ (self)
 
-def screen (self)
 
-def installer (self)
 
-def prompt (self, questions)
 
-def h_rule (self)
 
-def banner (self)
 
-def banner_render (self)
 
- - - -

-Static Public Member Functions

-def clear ()
 
- - - - - - - - - - - - - - - - - - - -

-Public Attributes

term
 
y
 
home
 
user
 
version
 
slogan
 
green
 
blue
 
clr_term
 
-

Detailed Description

-

The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html b/docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html deleted file mode 100755 index d32fd28..0000000 --- a/docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.lib.pyShelf.InitFiles Member List
-
-
- -

This is the complete list of members for src.backend.lib.pyShelf.InitFiles, including all inherited members.

- - - -
__init__(self, file_array) (defined in src.backend.lib.pyShelf.InitFiles)src.backend.lib.pyShelf.InitFiles
CreateFile(self, _pointer)src.backend.lib.pyShelf.InitFiles
- - - - diff --git a/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html b/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html deleted file mode 100755 index d8b183b..0000000 --- a/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.tests.library_test.Test_Config Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.tests.library_test.Test_Config Class Reference
-
-
-
- + Inheritance diagram for src.backend.tests.library_test.Test_Config:
-
-
- - - - - - - - - -

-Public Member Functions

-def __init__ (self)
 
def open_file (self, root="config.json")
 
-def django_secret (self, _data)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

book_path
 
TITLE
 
VERSION
 
book_shelf
 
catalogue_db
 
user
 
password
 
db_host
 
db_port
 
file_array
 
root
 
auto_scan
 
allowed_hosts
 
db_user
 
db_pass
 
SECRET
 
-

Detailed Description

-

Member Function Documentation

- -

◆ open_file()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.tests.library_test.Test_Config.open_file ( self,
 _cp = "config.json" 
)
-
-
Opens config.json and reads in configuration options
-
-

Reimplemented from src.backend.lib.config.Config.

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png b/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png deleted file mode 100755 index d263ae18777b11ed87ebe78438cbd3c52de3936d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmeAS@N?(olHy`uVBq!ia0vp^KY=)agBeJ^X;N+hQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;QAHhKg(_!fC~E%ns%-1w#TlZxlswz*sDYjgWm zWVM%`Q(J5A`AJH`>(WX)x4NW~M^Elu{c7*~*W{lt`OHl&>-?U1 z@y5Sjm;T>h`BAX?K)@uuFFciB_wUWN$nvjD?f!j^Yqk1%$@^#WVrNy}`*#8)ud*|8 z>&+I<-jjWf0e@`2dmQH6dvohTmDm?cbL1!GZ#_Qw`aXNVJcHeOpHFQ~IP+QjWbfzK z)pqZyKg^RqtG)H_rGQE2z9wy(9`z=>TJzUZrkw#(eLig6TgN)<=G{HNZ0(JwEXl6@ zU#;h9zplOUU-%RL`1|r}3nqOjd&{Zk`Mm1J2maLEDu0j9dNN7GdveUAq)gTLX{ntW z4gD|K1cDMz=5Jr|BJpJShXpSRPp0RxcP#Vd6Y!oaqcBa)(m}_!s3Bt36NZf@CmEA6 zCovznq{7~@6ivZ*?WI$kx>y7PV47kl@U!=)z4`lgL-zXKw~RY3+z4EE#-TQ6v;5sE z>3Vqu`;QDWo?i&Gzx(CR|1z<~nmhBkuk4L&-e$Hv@AoZ!UGq-?w!+Erx6aP|zPk4B z{k_vSzn1-Z_otEAEbF%xJU)7gCJ+s^ysPpO7xqEhPH5;Nff4UJ^yyou& z^P=Ccx4kUBvi@z;gF_eH7n|yQdwWbLck>y}%IR+(FP!(MVs`E}{*&8RJv^Bm@4qj6 zW{u^q9CPDMxzbA(Dm&ZBRJGQKd_B0w=(zex1538$mnQ$#*z)ACTkw%{oBvL#*)abx zC}tkcvv>M;$5y}D{mETh^P6$2*RFoMv~Ak0hh}j`3pGzx-p zYBuwIWqBuGmh}Ps3({qutxsmZ-L#yeVCiu+*$|6{^RJ$N4{H8=dz0(~TX - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.lib.config.Config Member List
-
-
- -

This is the complete list of members for src.backend.lib.config.Config, including all inherited members.

- - - - - - - - - - - - - - - - - - - - -
__init__(self, root)src.backend.lib.config.Config
allowed_hosts (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
auto_scan (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_path (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_shelf (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
catalogue_db (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_host (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_pass (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_port (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
django_secret(self, _data) (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
file_array (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
open_file(self, _cp)src.backend.lib.config.Config
password (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
root (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
SECRET (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
TITLE (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
VERSION (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
- - - - diff --git a/docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html b/docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html deleted file mode 100755 index 4c9b937..0000000 --- a/docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.tests.library_test.TestCatalogue Member List
-
- - - - - diff --git a/docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html b/docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html deleted file mode 100755 index aa04309..0000000 --- a/docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.4.1 -
-
Open source, console based E-book server
-
-
- - - - - - - -
-
-
-
src.backend.lib.display.TerminalDisplay Member List
-
-
- -

This is the complete list of members for src.backend.lib.display.TerminalDisplay, including all inherited members.

- - - - - - - - - - - - - - - - - - -
__init__(self) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
banner(self) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
banner_render(self) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
blue (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
clear() (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplaystatic
clr_term (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
green (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
h_rule(self) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
home (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
installer(self) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
prompt(self, questions) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
screen(self) (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
slogan (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
term (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
user (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
version (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
y (defined in src.backend.lib.display.TerminalDisplay)src.backend.lib.display.TerminalDisplay
- - - - diff --git a/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html b/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html deleted file mode 100755 index 9b3f2d6..0000000 --- a/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html +++ /dev/null @@ -1,422 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.library.Catalogue Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.lib.library.Catalogue Class Reference
-
-
-
- + Inheritance diagram for src.backend.lib.library.Catalogue:
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

-def __init__ (self, config)
 
def scan_folder (self, _path=None)
 
def filter_books (self)
 
-def process_by_filetype (self, book)
 
def extract_metadata_epub (self, book)
 
-def extract_metadata_mobi (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)
 
- - - - - -

-Static Public Member Functions

def process_epub (book)
 
-def stripTags (source)
 
- - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

file_list
 
opf_regx
 
cover_regx
 
html_regx
 
title_sanitization_regx
 
title_sanitization_lvl2_regx
 
title_sanitization_dirs_regx
 
root_dir
 
book_folder
 
books
 
db_pointer
 
config
 
-

Detailed Description

-
Decodes book metadata for storage
-

Member Function Documentation

- -

◆ compare_shelf_current()

- -
-
- - - - - - - - -
def src.backend.lib.library.Catalogue.compare_shelf_current ( self)
-
-
Calls storage system, gets list of books stored and compares against files on disk
-
-
-
- -

◆ extract_content()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_content ( self,
 book_zip,
 book 
)
-
-
Opens epub as zip file filters then stores as list any files matching opf_regx
-
-
-
- -

◆ extract_cover_html()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_cover_html ( self,
 book_zip,
 book 
)
-
-
Opens epub as zip file filters then stores as list any files matching html_regx
-
-
-
- -

◆ extract_cover_image()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_cover_image ( self,
 book_zip,
 book 
)
-
-
Opens epub as zip file filters then stores as list any files matching cover_regx
-
-
-
- -

◆ extract_metadata_epub()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_metadata_epub ( 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 src.backend.lib.library.Catalogue.filter_books ( self)
-
-
Calls scan_folder and filters out book files
-Proceeds to call process_book
-
-:returns self._book_list_expanded: json string containing all book metadata
-
-

Reimplemented in src.backend.tests.library_test.Test_Catalogue.

- -
-
- -

◆ import_books()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.import_books ( self,
 list = None 
)
-
-
Main entry point for import operations.
-Gets a list of new files via compare_shelf_current.
-Iterates over list and inserts new books into database.
-
-
-
- -

◆ process_epub()

- -
-
- - - - - -
- - - - - - - - -
def src.backend.lib.library.Catalogue.process_epub ( book)
-
-static
-
-
Return dictionary of epub file contents
-
-
- -

◆ scan_folder()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.scan_folder ( self,
 _path = None 
)
-
-
Scan folder by _path, allows recurisive scanning
-
-
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png b/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png deleted file mode 100755 index 22e8081e1ac0a38d0b3a339da0b802b4d818217b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 966 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+19PaSi(^Oy5$;dAS@h{8$9Os7sZj)ak?*50b@I+ln`(l1;N1Lcs3I9Ixy`nYe zUu8-O9!Oq$G2n5*;h-H?^tc>u8VOom>HBDBe4{h%%KiL{8;ZY}oO_j)$#dVTH%j;F z@!(}WHGA9-Pm68HUK<*?zv>~|i@>*OQHv8#o-uise#%Cv;ds@;yd8V14JTdro^p4` zvWw@ZEPvIeZN>2YYt*uyuKaT%(GTWcJSW2H&05$ecz*tY+{g3ZzV%tT@a)5@|LdOm zFjh>ScKpYqCHtC=-4d8y#2oP5{6d86L$5rBSO5Ba7=Li9_AX%*(9BffZSb(}1%}_1 zO2(RoJcgA^7!yi&tM)BnG{|h9XaNk(1u3A=L{jdloXOzgCFRMi5Om2yiecg;w@VBi zQxE}G_F5Xg4Hi5~nJIZ8@#3yXi$Zr)h_c#o@# zoCe>PxzjsVM9Pq`zKd1VTvjujGs|uMql)YqvmEC-oBxv5T~--? zzsv2y?AMljPo~x9ZPNdFarN@duz77=51m$RTp26UFiS1b?#tp=b-D2uW*DjFb*;K` z<^9tO&wV&E=S)3$Nn+njx3wu*?Qxeg-d7bQD!3}=Y?^6Q^h>Tcu&h*cZn*l7J*m5I z`#e)Xc(Oujp`rMxr#>^&MX&KrmlF?ky3bwuSW+sxbg{WzsCmrBE~C_t%Hm}= z9=+))Ted~cZSVSRHzgkX1a4fug`c@K{nUvg6Dv*gxP#i$`40RupR1{)B(D(6;_6c8 zo#-y_mVCv1?=2;z{w<#-YWL0edc3~unCLeD)4*W<4h>&me06lV+{&C1puj=|H_&t;ucLK6TJyuCdD diff --git a/docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html b/docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html deleted file mode 100755 index d13e851..0000000 --- a/docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.tests.library_test.Test_Config Member List
-
-
- -

This is the complete list of members for src.backend.tests.library_test.Test_Config, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - -
__init__(self) (defined in src.backend.tests.library_test.Test_Config)src.backend.tests.library_test.Test_Config
src::backend::lib::config::Config.__init__(self, root)src.backend.lib.config.Config
allowed_hosts (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
auto_scan (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_path (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_shelf (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
catalogue_db (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_host (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_pass (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_port (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
django_secret(self, _data) (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
file_array (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
open_file(self, root="config.json")src.backend.tests.library_test.Test_Config
password (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
root (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
SECRET (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
TITLE (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
VERSION (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
- - - - diff --git a/docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html b/docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html deleted file mode 100755 index f7d2cb9..0000000 --- a/docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.tests.config_test.TestConfig Member List
-
- - - - - diff --git a/docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html b/docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html deleted file mode 100755 index 2dc3649..0000000 --- a/docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.lib.library.Catalogue Member List
-
-
- -

This is the complete list of members for src.backend.lib.library.Catalogue, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
__init__(self, config) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
book_folder (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
books (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
compare_shelf_current(self)src.backend.lib.library.Catalogue
config (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
cover_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
db_pointer (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_content(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_html(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_image(self, book_zip, book)src.backend.lib.library.Catalogue
extract_metadata_epub(self, book)src.backend.lib.library.Catalogue
extract_metadata_mobi(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
file_list (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
filter_books(self)src.backend.lib.library.Catalogue
html_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
import_books(self, list=None)src.backend.lib.library.Catalogue
opf_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_by_filetype(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_epub(book)src.backend.lib.library.Cataloguestatic
root_dir (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
scan_folder(self, _path=None)src.backend.lib.library.Catalogue
stripTags(source) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Cataloguestatic
title_sanitization_dirs_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_lvl2_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
- - - - diff --git a/docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html b/docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html deleted file mode 100755 index 59be543..0000000 --- a/docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.storage.Storage Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.lib.storage.Storage Class Reference
-
-
- - - - - - - - - - - - - - - - - - -

-Public Member Functions

-def __init__ (self, config)
 
-def check_ownership (self, table=None)
 
def create_tables (self)
 
def insert_book (self, book)
 
def book_paths_list (self)
 
def commit (self)
 
def close (self)
 
-def make_collections (self)
 
- - - - - - - - - - - - - - - - - -

-Public Attributes

sql
 
user
 
password
 
db_host
 
db_port
 
db
 
config
 
cursor
 
-

Detailed Description

-
Contains all methods for system storage

Member Function Documentation

- -

◆ book_paths_list()

- -
-
- - - - - - - - -
def src.backend.lib.storage.Storage.book_paths_list ( self)
-
-
Get file paths from database for comparison to system files
-
-
-
- -

◆ close()

- -
-
- - - - - - - - -
def src.backend.lib.storage.Storage.close ( self)
-
-
Close database connection
-
-
-
- -

◆ commit()

- -
-
- - - - - - - - -
def src.backend.lib.storage.Storage.commit ( self)
-
-
Commit database transactions
-
-
-
- -

◆ create_tables()

- -
-
- - - - - - - - -
def src.backend.lib.storage.Storage.create_tables ( self)
-
-
Create table structure
-
-
- -

◆ insert_book()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.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/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html b/docs/html/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html deleted file mode 100755 index 0293bd4..0000000 --- a/docs/html/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.lib.pyShelf.BookDisplay Member List
-
- - - - - diff --git a/docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html b/docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html deleted file mode 100755 index 7961883..0000000 --- a/docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.api_hooks.DuckDuckGo Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.lib.api_hooks.DuckDuckGo Class Reference
-
-
- - - - - - -

-Public Member Functions

-def __init__ (self)
 
def image_result (self, query)
 
- - - -

-Public Attributes

url
 
-

Detailed Description

-
duckduckgo related searching

Member Function Documentation

- -

◆ image_result()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.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/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html b/docs/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html deleted file mode 100755 index ac07992..0000000 --- a/docs/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.tests.library_test.TestCatalogue Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.tests.library_test.TestCatalogue Class Reference
-
-
- - - - -

-Public Member Functions

-def test_filter_books (self)
 
- - - - - -

-Static Public Attributes

root = os.path.abspath(os.path.curdir)
 
config = Test_Config()
 
-

Detailed Description

-

The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html b/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html deleted file mode 100755 index 2127c9a..0000000 --- a/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.config.Config Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.lib.config.Config Class Reference
-
-
-
- + Inheritance diagram for src.backend.lib.config.Config:
-
-
- - - - - - - - - -

-Public Member Functions

def __init__ (self, root)
 
def open_file (self, _cp)
 
-def django_secret (self, _data)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

book_path
 
TITLE
 
VERSION
 
book_shelf
 
catalogue_db
 
user
 
password
 
db_host
 
db_port
 
file_array
 
root
 
auto_scan
 
allowed_hosts
 
db_user
 
db_pass
 
SECRET
 
-

Detailed Description

-
Main System Configuration
-

Constructor & Destructor Documentation

- -

◆ __init__()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.config.Config.__init__ ( self,
 root 
)
-
-
Initialize main configuration options
-
-
-
-

Member Function Documentation

- -

◆ open_file()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.config.Config.open_file ( self,
 _cp 
)
-
-
Opens config.json and reads in configuration options
-
-

Reimplemented in src.backend.tests.library_test.Test_Config.

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png b/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png deleted file mode 100755 index c1f0983c5d75c5ea973c2b96c6f7594cad1452ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0008%Nkl$0;T3`LilnZExce;!c?7ccc(+J2$q9t$La1tI=rnx@I6m;fAVkOTPAAP4ZJ z?~`}^_kynd^D908`|8x+r6>awx>KlMMt)#)5M=3U`fnjTMIN_%amiahH)FSbttYxQ zwxRmW^Z8ZYU$5nVj8g8{1w()nJ!iYckMF!4xhK6gi)CerwIt6OUwPLdjbCZMX9#ej zC&|sM)gsK+nC$3mN_o#qq^?72c5Vo8qFdSCC6BeIB+q>xPHr%pF7rxZyF8yrZi1iR z^M2pOd%owFYWt}nz_D&-d#c4{ZBIo%RiI+4QYMtOJ%0r%@5V2G&yNfN&h`E8Il!;$ z@*@8$^2^uvS1TOApKDEUfMZ=Y{GeG7!wI15m*oN|% z82i+&&b*!N>;D=(on0HKJp6XZAlmiCSjEvN@;qYaUz?V9U2ke6i*5G8-adxBGg~!t zKTvh7?NDh{tgl+8B{%k!yIF_Hj?Shu3oaasdv0g4?H%$a+xtT;`Q9?yZ10lCs!@{X zzLtEgGTY^7v)y=Xw)G};0~zw}&>iyLu6O*l+gT+^H#s_|(vp|EP?L8XRS`SR_EYlC zdiL*mzwgF9ze4`pJx_ys - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.pyShelf.InitFiles Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.lib.pyShelf.InitFiles Class Reference
-
-
- - - - - - -

-Public Member Functions

-def __init__ (self, file_array)
 
def CreateFile (self, _pointer)
 
-

Detailed Description

-
First run file creation operations

Member Function Documentation

- -

◆ CreateFile()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.pyShelf.InitFiles.CreateFile ( self,
 _pointer 
)
-
-
Checks if file exists and creates it if not
-
-
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html b/docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html deleted file mode 100755 index 012e93b..0000000 --- a/docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.lib.pyShelf.BookDisplay Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.lib.pyShelf.BookDisplay Class Reference
-
-
- - - - - - - - - - -

-Public Member Functions

def __init__ (self, **kwargs)
 
def nextPage (self)
 
def previousPage (self)
 
def booksPerPage (self, screen_size)
 
- - - - - - - - - - - - - -

-Public Attributes

books_per_page
 
current_page
 
thumbnail_size
 
thumbnail_scale
 
total_pages
 
screen_size
 
-

Detailed Description

-
All functions related to displaying book information in the HTML UI

Constructor & Destructor Documentation

- -

◆ __init__()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.pyShelf.BookDisplay.__init__ ( self,
** kwargs 
)
-
-
Initialize class variables
-:return: None
-
-
-
-

Member Function Documentation

- -

◆ booksPerPage()

- -
-
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.pyShelf.BookDisplay.booksPerPage ( self,
 screen_size 
)
-
-
## TODO Remove me
-Set books per page
-:param screen_size: Array containing x,y pixel sizes
-:return: self.books_per_page
-
-
-
- -

◆ nextPage()

- -
-
- - - - - - - - -
def src.backend.lib.pyShelf.BookDisplay.nextPage ( self)
-
-
## TODO Remove me
-Goto next book page
-:return: new current_page
-
-
-
- -

◆ previousPage()

- -
-
- - - - - - - - -
def src.backend.lib.pyShelf.BookDisplay.previousPage ( self)
-
-
## TODO Remove me
-Goto previous book page
-:return: new current_page
-
-
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html b/docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html deleted file mode 100755 index 9bfacff..0000000 --- a/docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.lib.storage.Storage Member List
-
- - - - - diff --git a/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html b/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html deleted file mode 100755 index d368e1a..0000000 --- a/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html +++ /dev/null @@ -1,480 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.tests.library_test.Test_Catalogue Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.tests.library_test.Test_Catalogue Class Reference
-
-
-
- + Inheritance diagram for src.backend.tests.library_test.Test_Catalogue:
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

-def __init__ (self)
 
def filter_books (self)
 
def scan_folder (self, _path=None)
 
-def process_by_filetype (self, book)
 
def extract_metadata_epub (self, book)
 
-def extract_metadata_mobi (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)
 
- - - - - -

-Static Public Member Functions

def process_epub (book)
 
-def stripTags (source)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

book_shelf
 
file_list
 
opf_regx
 
cover_regx
 
html_regx
 
title_sanitization_regx
 
title_sanitization_lvl2_regx
 
title_sanitization_dirs_regx
 
root_dir
 
book_folder
 
books
 
db_pointer
 
config
 
-

Detailed Description

-

Member Function Documentation

- -

◆ compare_shelf_current()

- -
-
- - - - - -
- - - - - - - - -
def src.backend.lib.library.Catalogue.compare_shelf_current ( self)
-
-inherited
-
-
Calls storage system, gets list of books stored and compares against files on disk
-
-
-
- -

◆ extract_content()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_content ( self,
 book_zip,
 book 
)
-
-inherited
-
-
Opens epub as zip file filters then stores as list any files matching opf_regx
-
-
-
- -

◆ extract_cover_html()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_cover_html ( self,
 book_zip,
 book 
)
-
-inherited
-
-
Opens epub as zip file filters then stores as list any files matching html_regx
-
-
-
- -

◆ extract_cover_image()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_cover_image ( self,
 book_zip,
 book 
)
-
-inherited
-
-
Opens epub as zip file filters then stores as list any files matching cover_regx
-
-
-
- -

◆ extract_metadata_epub()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.extract_metadata_epub ( self,
 book 
)
-
-inherited
-
-
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 src.backend.tests.library_test.Test_Catalogue.filter_books ( self)
-
-
Calls scan_folder and filters out book files
-Proceeds to call process_book
-
-:returns self._book_list_expanded: json string containing all book metadata
-
-

Reimplemented from src.backend.lib.library.Catalogue.

- -
-
- -

◆ import_books()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.import_books ( self,
 list = None 
)
-
-inherited
-
-
Main entry point for import operations.
-Gets a list of new files via compare_shelf_current.
-Iterates over list and inserts new books into database.
-
-
-
- -

◆ process_epub()

- -
-
- - - - - -
- - - - - - - - -
def src.backend.lib.library.Catalogue.process_epub ( book)
-
-staticinherited
-
-
Return dictionary of epub file contents
-
-
- -

◆ scan_folder()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
def src.backend.lib.library.Catalogue.scan_folder ( self,
 _path = None 
)
-
-inherited
-
-
Scan folder by _path, allows recurisive scanning
-
-
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png b/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png deleted file mode 100755 index 2532ba5bc84ed8c39b96a694a99d8d2f00566f89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+19PCKi(^Oy!rMA38NzuCu>JmVH_ z{<(esU(q^8VxtGBvzr32ACpq1H?ZR`HD}ZFOK=_iv9N&T|9sB@{P^W z{)>M;%bb#vDaEh8bnbC?lV4l3J)h4yy{PW%A>IK0eYbszO{$EPdylK9%1l(Tz0O^E z`0d@v6I=FmS3aI|tZ;eEDQUfz9+#5$mIXx}d;e~V-9hWc_cYn2aXymKowvX7^|AY> zU(XG4DxZG+<9F@yE|pr3;M;$fvekDSyK`sRxi*#0|5&9q2hX;Yo^#V(T1wqbi^elj8@J-=#wWAtpR&SzUp`ZTvi z0i!Kzc9x83)|qwtYI%DXm|riJIidSM;!60Z#pdyc*Vyn1A8s{CHr}nlVCu6d`-S_} zZ%Z#{E|_raXQf1#qExZV;`xi0Z%kh{&+T)siI9`+sgoO0p2)4d%|$$I%R ztv-eJRPhz9RBE}nQnTPb=tk - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.tests.library_test.Test_Catalogue Member List
-
-
- -

This is the complete list of members for src.backend.tests.library_test.Test_Catalogue, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
__init__(self) (defined in src.backend.tests.library_test.Test_Catalogue)src.backend.tests.library_test.Test_Catalogue
__init__(self, config) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
book_folder (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
book_shelf (defined in src.backend.tests.library_test.Test_Catalogue)src.backend.tests.library_test.Test_Catalogue
books (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
compare_shelf_current(self)src.backend.lib.library.Catalogue
config (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
cover_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
db_pointer (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_content(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_html(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_image(self, book_zip, book)src.backend.lib.library.Catalogue
extract_metadata_epub(self, book)src.backend.lib.library.Catalogue
extract_metadata_mobi(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
file_list (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
filter_books(self)src.backend.tests.library_test.Test_Catalogue
html_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
import_books(self, list=None)src.backend.lib.library.Catalogue
opf_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_by_filetype(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_epub(book)src.backend.lib.library.Cataloguestatic
root_dir (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
scan_folder(self, _path=None)src.backend.lib.library.Catalogue
stripTags(source) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Cataloguestatic
title_sanitization_dirs_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_lvl2_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
- - - - diff --git a/docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html b/docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html deleted file mode 100755 index 18d0968..0000000 --- a/docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Member List - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src.backend.lib.api_hooks.DuckDuckGo Member List
-
- - - - - diff --git a/docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html b/docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html deleted file mode 100755 index e928079..0000000 --- a/docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src.backend.tests.config_test.TestConfig Class Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
- -
-
src.backend.tests.config_test.TestConfig Class Reference
-
-
- - - - - - - - -

-Public Member Functions

-def test_book_dir (self)
 
-def test_title (self)
 
-def test_version (self)
 
- - - -

-Static Public Attributes

config = Config(os.path.abspath(os.path.curdir))
 
-

Detailed Description

-

The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html b/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html deleted file mode 100755 index 18cc6e8..0000000 --- a/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src/backend/lib Directory Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
lib Directory Reference
-
-
-
- - - - diff --git a/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html b/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html deleted file mode 100755 index f696e8f..0000000 --- a/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src/backend Directory Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
backend Directory Reference
-
-
- - -

-Directories

-
- - - - diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html deleted file mode 100755 index a817550..0000000 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src Directory Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
src Directory Reference
-
-
- - -

-Directories

-
- - - - diff --git a/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html b/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html deleted file mode 100755 index a4f6f0b..0000000 --- a/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: src/backend/tests Directory Reference - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - - -
-
-
-
tests Directory Reference
-
-
-
- - - - diff --git a/docs/html/doc.png b/docs/html/doc.png deleted file mode 100755 index 17edabff95f7b8da13c9516a04efe05493c29501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css deleted file mode 100755 index 5e35db3..0000000 --- a/docs/html/doxygen.css +++ /dev/null @@ -1,1730 +0,0 @@ -/* The standard CSS for doxygen 1.8.18 */ - -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; -} - -th p.starttd, p.intertd, p.endtd { - font-size: 100%; - font-weight: 700; -} - -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, .memTemplItemRight { - 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.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 deleted file mode 100755 index 3ff17d807fd8aa003bed8bb2a69e8f0909592fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js deleted file mode 100755 index 88f2c27..0000000 --- a/docs/html/dynsections.js +++ /dev/null @@ -1,128 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @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.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
-
-
-
File List
-
-
-
Here is a list of all documented files with brief descriptions:
-
[detail level 1234]
- - - - - - - - - - - - - - - - -
  src
  backend
  lib
 __init__.py
 api_hooks.py
 config.py
 library.py
 pyShelf.py
 storage.py
  tests
 __init__.py
 config_test.py
 library_test.py
 __init__.py
 pyShelf_MakeCollections.py
 pyShelf_ScanLibrary.py
-
-
- - - - diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png deleted file mode 100755 index bb8ab35edce8e97554e360005ee9fc5bffb36e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA diff --git a/docs/html/functions.html b/docs/html/functions.html deleted file mode 100755 index 0e454d9..0000000 --- a/docs/html/functions.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Class Members - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
-
-
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 deleted file mode 100755 index ea4cd9f..0000000 --- a/docs/html/functions_func.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Class Members - Functions - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
- - - - - diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html deleted file mode 100755 index e9d776b..0000000 --- a/docs/html/hierarchy.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Class Hierarchy - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
-
-
-
Class Hierarchy
-
- - - - - diff --git a/docs/html/index.hhc b/docs/html/index.hhc deleted file mode 100755 index 6712a06..0000000 --- a/docs/html/index.hhc +++ /dev/null @@ -1,251 +0,0 @@ - - - - - -
    -
  • -
      -
    • -
        -
      • -
          -
        • -
            -
          • -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                -
              • -
                  -
                • -
                • -
                -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                -
              -
            -
          • -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                -
              -
            • -
                -
              • -
                  -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                -
              • -
                  -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                • -
                -
              • -
                  -
                • -
                -
              -
            -
          -
        -
      -
    • -
    • -
        -
      • -
      • -
          -
        • -
        -
      • -
          -
        • -
        -
      • -
      • -
      • -
      • -
      • -
      -
    • -
        -
      • -
      • -
      -
    -
  • -
      -
    • -
        -
      • -
          -
        • -
            -
          • -
              -
            • -
            • -
            • -
            • -
            • -
            • -
            -
          • -
              -
            • -
            • -
            • -
            -
          • -
          • -
          • -
          -
        -
      -
    -
- - diff --git a/docs/html/index.hhk b/docs/html/index.hhk deleted file mode 100755 index e54d40a..0000000 --- a/docs/html/index.hhk +++ /dev/null @@ -1,798 +0,0 @@ - - - - - -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
  • -
  • -
  • -
      -
    • -
    -
  • -
      -
    • -
    -
  • -
  • -
      -
    • -
    -
  • -
- - diff --git a/docs/html/index.hhp b/docs/html/index.hhp deleted file mode 100755 index 533b45e..0000000 --- a/docs/html/index.hhp +++ /dev/null @@ -1,64 +0,0 @@ -[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] -d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html -de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html -d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html -d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html -d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html -d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html -db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html -d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html -da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html -d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html -d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html -db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html -df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html -d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html -db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html -dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html -d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html -d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html -d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html -d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html -dir_3f615ade772d23cefe5e20dcb18424a2.html -dir_1c7294442ce83d360610449d04c9d7fc.html -dir_68267d1309a1af8e8297ef4c3efbcdba.html -dir_9020577e2da81c4cf5a5554c26431f94.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 -d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png -d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png -db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png -d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png diff --git a/docs/html/index.html b/docs/html/index.html deleted file mode 100755 index 7e70665..0000000 --- a/docs/html/index.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -pyShelf Open Source Ebook Server: Main Page - - - - - - -
-
- - - - - - -
-
pyShelf Open Source Ebook Server -  0.6.0 -
-
FOSS E-Book Server, https://pyshelf.com
-
-
- - - - - - -
-
-
-
pyShelf Open Source Ebook Server Documentation
-
-
-
- - - - diff --git a/docs/html/jquery.js b/docs/html/jquery.js deleted file mode 100755 index 103c32d..0000000 --- a/docs/html/jquery.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! 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=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element -},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** - * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler - * Licensed under MIT - * @author Ariel Flesler - * @version 2.1.2 - */ -;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/docs/html/menu.js b/docs/html/menu.js deleted file mode 100755 index d18a2fe..0000000 --- a/docs/html/menu.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { - function makeTree(data,relPath) { - var result=''; - if ('children' in data) { - result+=''; - } - return result; - } - - $('#main-nav').append(makeTree(menudata,relPath)); - $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); - if (searchEnabled) { - if (serverSide) { - $('#main-menu').append('
  • '); - } else { - $('#main-menu').append('
  • '); - } - } - $('#main-menu').smartmenus(); -} -/* @license-end */ diff --git a/docs/html/menudata.js b/docs/html/menudata.js deleted file mode 100755 index 02a40c8..0000000 --- a/docs/html/menudata.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file -*/ -var menudata={children:[ -{text:"Main Page",url:"index.html"}, -{text:"Classes",url:"annotated.html",children:[ -{text:"Class List",url:"annotated.html"}, -{text:"Class Index",url:"classes.html"}, -{text:"Class Hierarchy",url:"hierarchy.html"}, -{text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html"}, -{text:"Functions",url:"functions_func.html"}]}]}, -{text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}]}]} diff --git a/docs/html/nav_f.png b/docs/html/nav_f.png deleted file mode 100755 index 72a58a529ed3a9ed6aa0c51a79cf207e026deee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U diff --git a/docs/html/nav_g.png b/docs/html/nav_g.png deleted file mode 100755 index 2093a237a94f6c83e19ec6e5fd42f7ddabdafa81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png deleted file mode 100755 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png deleted file mode 100755 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png deleted file mode 100755 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png deleted file mode 100755 index e2b4a8638cb3496a016eaed9e16ffc12846dea18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/docs/html/tabs.css b/docs/html/tabs.css deleted file mode 100755 index 85a0cd5..0000000 --- a/docs/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 b/docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 deleted file mode 100755 index 099ef79..0000000 --- a/docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 +++ /dev/null @@ -1,50 +0,0 @@ -.TH "src.backend.lib.api_hooks.DuckDuckGo" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.api_hooks.DuckDuckGo -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self)" -.br -.ti -1c -.RI "def \fBimage_result\fP (self, query)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBurl\fP" -.br -.in -1c -.SH "Detailed Description" -.PP - -.PP -.nf -duckduckgo related searching -.fi -.PP - -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.image_result ( self, query)" - -.PP -.nf -Returns json containing url to image -:param _key: &t=h_&iar=images&iax=images&ia=images&format=json&pretty=1 - -.fi -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_lib_config_Config.3 b/docs/man/man3/src_backend_lib_config_Config.3 deleted file mode 100755 index d67939d..0000000 --- a/docs/man/man3/src_backend_lib_config_Config.3 +++ /dev/null @@ -1,113 +0,0 @@ -.TH "src.backend.lib.config.Config" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.config.Config -.SH SYNOPSIS -.br -.PP -.PP -Inherited by \fBsrc\&.backend\&.tests\&.library_test\&.Test_Config\fP\&. -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self, root)" -.br -.ti -1c -.RI "def \fBopen_file\fP (self, _cp)" -.br -.ti -1c -.RI "def \fBdjango_secret\fP (self, _data)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBbook_path\fP" -.br -.ti -1c -.RI "\fBTITLE\fP" -.br -.ti -1c -.RI "\fBVERSION\fP" -.br -.ti -1c -.RI "\fBbook_shelf\fP" -.br -.ti -1c -.RI "\fBcatalogue_db\fP" -.br -.ti -1c -.RI "\fBuser\fP" -.br -.ti -1c -.RI "\fBpassword\fP" -.br -.ti -1c -.RI "\fBdb_host\fP" -.br -.ti -1c -.RI "\fBdb_port\fP" -.br -.ti -1c -.RI "\fBfile_array\fP" -.br -.ti -1c -.RI "\fBroot\fP" -.br -.ti -1c -.RI "\fBauto_scan\fP" -.br -.ti -1c -.RI "\fBallowed_hosts\fP" -.br -.ti -1c -.RI "\fBdb_user\fP" -.br -.ti -1c -.RI "\fBdb_pass\fP" -.br -.ti -1c -.RI "\fBSECRET\fP" -.br -.in -1c -.SH "Detailed Description" -.PP - -.PP -.nf -Main System Configuration - -.fi -.PP - -.SH "Constructor & Destructor Documentation" -.PP -.SS "def src\&.backend\&.lib\&.config\&.Config\&.__init__ ( self, root)" - -.PP -.nf -Initialize main configuration options - -.fi -.PP - -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.config\&.Config\&.open_file ( self, _cp)" - -.PP -.nf -Opens config.json and reads in configuration options - -.fi -.PP - -.PP -Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Config\fP\&. - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_lib_display_TerminalDisplay.3 b/docs/man/man3/src_backend_lib_display_TerminalDisplay.3 deleted file mode 100755 index 5b17d9e..0000000 --- a/docs/man/man3/src_backend_lib_display_TerminalDisplay.3 +++ /dev/null @@ -1,78 +0,0 @@ -.TH "src.backend.lib.display.TerminalDisplay" 3 "Sun Feb 2 2020" "Version 0.4.1" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.display.TerminalDisplay -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self)" -.br -.ti -1c -.RI "def \fBscreen\fP (self)" -.br -.ti -1c -.RI "def \fBinstaller\fP (self)" -.br -.ti -1c -.RI "def \fBprompt\fP (self, questions)" -.br -.ti -1c -.RI "def \fBh_rule\fP (self)" -.br -.ti -1c -.RI "def \fBbanner\fP (self)" -.br -.ti -1c -.RI "def \fBbanner_render\fP (self)" -.br -.in -1c -.SS "Static Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fBclear\fP ()" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBterm\fP" -.br -.ti -1c -.RI "\fBy\fP" -.br -.ti -1c -.RI "\fBhome\fP" -.br -.ti -1c -.RI "\fBuser\fP" -.br -.ti -1c -.RI "\fBversion\fP" -.br -.ti -1c -.RI "\fBslogan\fP" -.br -.ti -1c -.RI "\fBgreen\fP" -.br -.ti -1c -.RI "\fBblue\fP" -.br -.ti -1c -.RI "\fBclr_term\fP" -.br -.in -1c -.SH "Detailed Description" -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_lib_library_Catalogue.3 b/docs/man/man3/src_backend_lib_library_Catalogue.3 deleted file mode 100755 index f622e5b..0000000 --- a/docs/man/man3/src_backend_lib_library_Catalogue.3 +++ /dev/null @@ -1,202 +0,0 @@ -.TH "src.backend.lib.library.Catalogue" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.library.Catalogue -.SH SYNOPSIS -.br -.PP -.PP -Inherited by \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&. -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self, config)" -.br -.ti -1c -.RI "def \fBscan_folder\fP (self, _path=None)" -.br -.ti -1c -.RI "def \fBfilter_books\fP (self)" -.br -.ti -1c -.RI "def \fBprocess_by_filetype\fP (self, book)" -.br -.ti -1c -.RI "def \fBextract_metadata_epub\fP (self, book)" -.br -.ti -1c -.RI "def \fBextract_metadata_mobi\fP (self, book)" -.br -.ti -1c -.RI "def \fBextract_content\fP (self, book_zip, book)" -.br -.ti -1c -.RI "def \fBextract_cover_html\fP (self, book_zip, book)" -.br -.ti -1c -.RI "def \fBextract_cover_image\fP (self, book_zip, book)" -.br -.ti -1c -.RI "def \fBcompare_shelf_current\fP (self)" -.br -.ti -1c -.RI "def \fBimport_books\fP (self, list=None)" -.br -.in -1c -.SS "Static Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fBprocess_epub\fP (book)" -.br -.ti -1c -.RI "def \fBstripTags\fP (source)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBfile_list\fP" -.br -.ti -1c -.RI "\fBopf_regx\fP" -.br -.ti -1c -.RI "\fBcover_regx\fP" -.br -.ti -1c -.RI "\fBhtml_regx\fP" -.br -.ti -1c -.RI "\fBtitle_sanitization_regx\fP" -.br -.ti -1c -.RI "\fBtitle_sanitization_lvl2_regx\fP" -.br -.ti -1c -.RI "\fBtitle_sanitization_dirs_regx\fP" -.br -.ti -1c -.RI "\fBroot_dir\fP" -.br -.ti -1c -.RI "\fBbook_folder\fP" -.br -.ti -1c -.RI "\fBbooks\fP" -.br -.ti -1c -.RI "\fBdb_pointer\fP" -.br -.ti -1c -.RI "\fBconfig\fP" -.br -.in -1c -.SH "Detailed Description" -.PP - -.PP -.nf -Decodes book metadata for storage - -.fi -.PP - -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)" - -.PP -.nf -Calls storage system, gets list of books stored and compares against files on disk - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)" - -.PP -.nf -Opens epub as zip file filters then stores as list any files matching opf_regx - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)" - -.PP -.nf -Opens epub as zip file filters then stores as list any files matching html_regx - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)" - -.PP -.nf -Opens epub as zip file filters then stores as list any files matching cover_regx - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_epub ( self, book)" - -.PP -.nf -Return extracted metadata and cover picture -book['path'] == Full path to ebook file -book['files'] == list of files from self.process_book(book) - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.filter_books ( self)" - -.PP -.nf -Calls scan_folder and filters out book files -Proceeds to call process_book - -:returns self._book_list_expanded: json string containing all book metadata - -.fi -.PP - -.PP -Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&. -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.import_books ( self, list = \fCNone\fP)" - -.PP -.nf -Main entry point for import operations. -Gets a list of new files via compare_shelf_current. -Iterates over list and inserts new books into database. - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.process_epub ( book)\fC [static]\fP" - -.PP -.nf -Return dictionary of epub file contents -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.scan_folder ( self, _path = \fCNone\fP)" - -.PP -.nf -Scan folder by _path, allows recurisive scanning - -.fi -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3 b/docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3 deleted file mode 100755 index e033831..0000000 --- a/docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3 +++ /dev/null @@ -1,107 +0,0 @@ -.TH "src.backend.lib.pyShelf.BookDisplay" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.pyShelf.BookDisplay -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self, **kwargs)" -.br -.ti -1c -.RI "def \fBnextPage\fP (self)" -.br -.ti -1c -.RI "def \fBpreviousPage\fP (self)" -.br -.ti -1c -.RI "def \fBbooksPerPage\fP (self, screen_size)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBbooks_per_page\fP" -.br -.ti -1c -.RI "\fBcurrent_page\fP" -.br -.ti -1c -.RI "\fBthumbnail_size\fP" -.br -.ti -1c -.RI "\fBthumbnail_scale\fP" -.br -.ti -1c -.RI "\fBtotal_pages\fP" -.br -.ti -1c -.RI "\fBscreen_size\fP" -.br -.in -1c -.SH "Detailed Description" -.PP - -.PP -.nf -All functions related to displaying book information in the HTML UI -.fi -.PP - -.SH "Constructor & Destructor Documentation" -.PP -.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.__init__ ( self, ** kwargs)" - -.PP -.nf -Initialize class variables -:return: None - -.fi -.PP - -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.booksPerPage ( self, screen_size)" - -.PP -.nf -## TODO Remove me -Set books per page -:param screen_size: Array containing x,y pixel sizes -:return: self.books_per_page - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.nextPage ( self)" - -.PP -.nf -## TODO Remove me -Goto next book page -:return: new current_page - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.previousPage ( self)" - -.PP -.nf -## TODO Remove me -Goto previous book page -:return: new current_page - -.fi -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_lib_pyShelf_InitFiles.3 b/docs/man/man3/src_backend_lib_pyShelf_InitFiles.3 deleted file mode 100755 index 5054cd6..0000000 --- a/docs/man/man3/src_backend_lib_pyShelf_InitFiles.3 +++ /dev/null @@ -1,42 +0,0 @@ -.TH "src.backend.lib.pyShelf.InitFiles" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.pyShelf.InitFiles -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self, file_array)" -.br -.ti -1c -.RI "def \fBCreateFile\fP (self, _pointer)" -.br -.in -1c -.SH "Detailed Description" -.PP - -.PP -.nf -First run file creation operations -.fi -.PP - -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.pyShelf\&.InitFiles\&.CreateFile ( self, _pointer)" - -.PP -.nf -Checks if file exists and creates it if not - -.fi -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_lib_storage_Storage.3 b/docs/man/man3/src_backend_lib_storage_Storage.3 deleted file mode 100755 index f291fd0..0000000 --- a/docs/man/man3/src_backend_lib_storage_Storage.3 +++ /dev/null @@ -1,124 +0,0 @@ -.TH "src.backend.lib.storage.Storage" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.lib.storage.Storage -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self, config)" -.br -.ti -1c -.RI "def \fBcheck_ownership\fP (self, table=None)" -.br -.ti -1c -.RI "def \fBcreate_tables\fP (self)" -.br -.ti -1c -.RI "def \fBinsert_book\fP (self, book)" -.br -.ti -1c -.RI "def \fBbook_paths_list\fP (self)" -.br -.ti -1c -.RI "def \fBcommit\fP (self)" -.br -.ti -1c -.RI "def \fBclose\fP (self)" -.br -.ti -1c -.RI "def \fBmake_collections\fP (self)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBsql\fP" -.br -.ti -1c -.RI "\fBuser\fP" -.br -.ti -1c -.RI "\fBpassword\fP" -.br -.ti -1c -.RI "\fBdb_host\fP" -.br -.ti -1c -.RI "\fBdb_port\fP" -.br -.ti -1c -.RI "\fBdb\fP" -.br -.ti -1c -.RI "\fBconfig\fP" -.br -.ti -1c -.RI "\fBcursor\fP" -.br -.in -1c -.SH "Detailed Description" -.PP - -.PP -.nf -Contains all methods for system storage -.fi -.PP - -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.book_paths_list ( self)" - -.PP -.nf -Get file paths from database for comparison to system files - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.close ( self)" - -.PP -.nf -Close database connection - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.commit ( self)" - -.PP -.nf -Commit database transactions - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.create_tables ( self)" - -.PP -.nf -Create table structure -.fi -.PP - -.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.insert_book ( self, book)" - -.PP -.nf -Insert book in database -:returns: True if succeeds False if not - -.fi -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_tests_config_test_TestConfig.3 b/docs/man/man3/src_backend_tests_config_test_TestConfig.3 deleted file mode 100755 index b124262..0000000 --- a/docs/man/man3/src_backend_tests_config_test_TestConfig.3 +++ /dev/null @@ -1,35 +0,0 @@ -.TH "src.backend.tests.config_test.TestConfig" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.tests.config_test.TestConfig -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fBtest_book_dir\fP (self)" -.br -.ti -1c -.RI "def \fBtest_title\fP (self)" -.br -.ti -1c -.RI "def \fBtest_version\fP (self)" -.br -.in -1c -.SS "Static Public Attributes" - -.in +1c -.ti -1c -.RI "\fBconfig\fP = \fBConfig\fP(os\&.path\&.abspath(os\&.path\&.curdir))" -.br -.in -1c -.SH "Detailed Description" -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_tests_library_test_TestCatalogue.3 b/docs/man/man3/src_backend_tests_library_test_TestCatalogue.3 deleted file mode 100755 index 1042991..0000000 --- a/docs/man/man3/src_backend_tests_library_test_TestCatalogue.3 +++ /dev/null @@ -1,32 +0,0 @@ -.TH "src.backend.tests.library_test.TestCatalogue" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.tests.library_test.TestCatalogue -.SH SYNOPSIS -.br -.PP -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fBtest_filter_books\fP (self)" -.br -.in -1c -.SS "Static Public Attributes" - -.in +1c -.ti -1c -.RI "\fBroot\fP = os\&.path\&.abspath(os\&.path\&.curdir)" -.br -.ti -1c -.RI "\fBconfig\fP = \fBTest_Config\fP()" -.br -.in -1c -.SH "Detailed Description" -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3 b/docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3 deleted file mode 100755 index 04fa819..0000000 --- a/docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3 +++ /dev/null @@ -1,197 +0,0 @@ -.TH "src.backend.tests.library_test.Test_Catalogue" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.tests.library_test.Test_Catalogue -.SH SYNOPSIS -.br -.PP -.PP -Inherits \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self)" -.br -.ti -1c -.RI "def \fBfilter_books\fP (self)" -.br -.ti -1c -.RI "def \fBscan_folder\fP (self, _path=None)" -.br -.ti -1c -.RI "def \fBprocess_by_filetype\fP (self, book)" -.br -.ti -1c -.RI "def \fBextract_metadata_epub\fP (self, book)" -.br -.ti -1c -.RI "def \fBextract_metadata_mobi\fP (self, book)" -.br -.ti -1c -.RI "def \fBextract_content\fP (self, book_zip, book)" -.br -.ti -1c -.RI "def \fBextract_cover_html\fP (self, book_zip, book)" -.br -.ti -1c -.RI "def \fBextract_cover_image\fP (self, book_zip, book)" -.br -.ti -1c -.RI "def \fBcompare_shelf_current\fP (self)" -.br -.ti -1c -.RI "def \fBimport_books\fP (self, list=None)" -.br -.in -1c -.SS "Static Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fBprocess_epub\fP (book)" -.br -.ti -1c -.RI "def \fBstripTags\fP (source)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBbook_shelf\fP" -.br -.ti -1c -.RI "\fBfile_list\fP" -.br -.ti -1c -.RI "\fBopf_regx\fP" -.br -.ti -1c -.RI "\fBcover_regx\fP" -.br -.ti -1c -.RI "\fBhtml_regx\fP" -.br -.ti -1c -.RI "\fBtitle_sanitization_regx\fP" -.br -.ti -1c -.RI "\fBtitle_sanitization_lvl2_regx\fP" -.br -.ti -1c -.RI "\fBtitle_sanitization_dirs_regx\fP" -.br -.ti -1c -.RI "\fBroot_dir\fP" -.br -.ti -1c -.RI "\fBbook_folder\fP" -.br -.ti -1c -.RI "\fBbooks\fP" -.br -.ti -1c -.RI "\fBdb_pointer\fP" -.br -.ti -1c -.RI "\fBconfig\fP" -.br -.in -1c -.SH "Detailed Description" -.PP -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)\fC [inherited]\fP" - -.PP -.nf -Calls storage system, gets list of books stored and compares against files on disk - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)\fC [inherited]\fP" - -.PP -.nf -Opens epub as zip file filters then stores as list any files matching opf_regx - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)\fC [inherited]\fP" - -.PP -.nf -Opens epub as zip file filters then stores as list any files matching html_regx - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)\fC [inherited]\fP" - -.PP -.nf -Opens epub as zip file filters then stores as list any files matching cover_regx - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_epub ( self, book)\fC [inherited]\fP" - -.PP -.nf -Return extracted metadata and cover picture -book['path'] == Full path to ebook file -book['files'] == list of files from self.process_book(book) - -.fi -.PP - -.SS "def src\&.backend\&.tests\&.library_test\&.Test_Catalogue\&.filter_books ( self)" - -.PP -.nf -Calls scan_folder and filters out book files -Proceeds to call process_book - -:returns self._book_list_expanded: json string containing all book metadata - -.fi -.PP - -.PP -Reimplemented from \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.import_books ( self, list = \fCNone\fP)\fC [inherited]\fP" - -.PP -.nf -Main entry point for import operations. -Gets a list of new files via compare_shelf_current. -Iterates over list and inserts new books into database. - -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.process_epub ( book)\fC [static]\fP, \fC [inherited]\fP" - -.PP -.nf -Return dictionary of epub file contents -.fi -.PP - -.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.scan_folder ( self, _path = \fCNone\fP)\fC [inherited]\fP" - -.PP -.nf -Scan folder by _path, allows recurisive scanning - -.fi -.PP - - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/man/man3/src_backend_tests_library_test_Test_Config.3 b/docs/man/man3/src_backend_tests_library_test_Test_Config.3 deleted file mode 100755 index 93253e8..0000000 --- a/docs/man/man3/src_backend_tests_library_test_Test_Config.3 +++ /dev/null @@ -1,94 +0,0 @@ -.TH "src.backend.tests.library_test.Test_Config" 3 "Mon Aug 3 2020" "Version 0.6.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- -.ad l -.nh -.SH NAME -src.backend.tests.library_test.Test_Config -.SH SYNOPSIS -.br -.PP -.PP -Inherits \fBsrc\&.backend\&.lib\&.config\&.Config\fP\&. -.SS "Public Member Functions" - -.in +1c -.ti -1c -.RI "def \fB__init__\fP (self)" -.br -.ti -1c -.RI "def \fBopen_file\fP (self, root='config\&.json')" -.br -.ti -1c -.RI "def \fBdjango_secret\fP (self, _data)" -.br -.in -1c -.SS "Public Attributes" - -.in +1c -.ti -1c -.RI "\fBbook_path\fP" -.br -.ti -1c -.RI "\fBTITLE\fP" -.br -.ti -1c -.RI "\fBVERSION\fP" -.br -.ti -1c -.RI "\fBbook_shelf\fP" -.br -.ti -1c -.RI "\fBcatalogue_db\fP" -.br -.ti -1c -.RI "\fBuser\fP" -.br -.ti -1c -.RI "\fBpassword\fP" -.br -.ti -1c -.RI "\fBdb_host\fP" -.br -.ti -1c -.RI "\fBdb_port\fP" -.br -.ti -1c -.RI "\fBfile_array\fP" -.br -.ti -1c -.RI "\fBroot\fP" -.br -.ti -1c -.RI "\fBauto_scan\fP" -.br -.ti -1c -.RI "\fBallowed_hosts\fP" -.br -.ti -1c -.RI "\fBdb_user\fP" -.br -.ti -1c -.RI "\fBdb_pass\fP" -.br -.ti -1c -.RI "\fBSECRET\fP" -.br -.in -1c -.SH "Detailed Description" -.PP -.SH "Member Function Documentation" -.PP -.SS "def src\&.backend\&.tests\&.library_test\&.Test_Config\&.open_file ( self, _cp = \fC'config\&.json'\fP)" - -.PP -.nf -Opens config.json and reads in configuration options - -.fi -.PP - -.PP -Reimplemented from \fBsrc\&.backend\&.lib\&.config\&.Config\fP\&. - -.SH "Author" -.PP -Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/warn.log b/docs/warn.log deleted file mode 100755 index b1f1252..0000000 --- a/docs/warn.log +++ /dev/null @@ -1,151 +0,0 @@ -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:28: warning: Compound src::backend::tests::library_test::TestCatalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:19: warning: Compound src::backend::tests::library_test::Test_Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:8: warning: Compound src::backend::tests::library_test::Test_Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:6: warning: Compound src::backend::tests::config_test::TestConfig is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:12: warning: Member __init__(self) (function) of class src::backend::lib::api_hooks::DuckDuckGo is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:13: warning: Member url (variable) of class src::backend::lib::api_hooks::DuckDuckGo is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:15: warning: parameters of member src.backend.lib.api_hooks.DuckDuckGo.image_result are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:15: warning: return type of member src.backend.lib.api_hooks.DuckDuckGo.image_result is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:50: warning: Member django_secret(self, _data) (function) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:20: warning: Member book_path (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:21: warning: Member TITLE (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:22: warning: Member VERSION (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:24: warning: Member book_shelf (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:25: warning: Member catalogue_db (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:26: warning: Member user (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:27: warning: Member password (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:28: warning: Member db_host (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:29: warning: Member db_port (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:30: warning: Member file_array (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:33: warning: Member root (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:34: warning: Member auto_scan (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:36: warning: Member allowed_hosts (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:37: warning: Member db_user (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:38: warning: Member db_pass (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:40: warning: Member SECRET (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:14: warning: parameters of member src.backend.lib.config.Config.__init__ are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:42: warning: parameters of member src.backend.lib.config.Config.open_file are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:42: warning: return type of member src.backend.lib.config.Config.open_file is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:24: warning: Member __init__(self, config) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:74: warning: Member process_by_filetype(self, book) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:177: warning: Member extract_metadata_mobi(self, book) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:173: warning: Member stripTags(source) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member file_list (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member opf_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member cover_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member html_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:29: warning: Member title_sanitization_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:30: warning: Member title_sanitization_lvl2_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member title_sanitization_dirs_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member root_dir (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member book_folder (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:34: warning: Member books (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:35: warning: Member db_pointer (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:36: warning: Member config (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:249: warning: return type of member src.backend.lib.library.Catalogue.compare_shelf_current is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:224: warning: parameters of member src.backend.lib.library.Catalogue.extract_content are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:224: warning: return type of member src.backend.lib.library.Catalogue.extract_content is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:231: warning: parameters of member src.backend.lib.library.Catalogue.extract_cover_html are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:231: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_html is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:238: warning: parameters of member src.backend.lib.library.Catalogue.extract_cover_image are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:238: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_image is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:99: warning: parameters of member src.backend.lib.library.Catalogue.extract_metadata_epub are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:99: warning: return type of member src.backend.lib.library.Catalogue.extract_metadata_epub is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:55: warning: return type of member src.backend.lib.library.Catalogue.filter_books is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:267: warning: parameters of member src.backend.lib.library.Catalogue.import_books are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:267: warning: return type of member src.backend.lib.library.Catalogue.import_books is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:83: warning: parameters of member src.backend.lib.library.Catalogue.process_epub are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:83: warning: return type of member src.backend.lib.library.Catalogue.process_epub is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:38: warning: parameters of member src.backend.lib.library.Catalogue.scan_folder are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:38: warning: return type of member src.backend.lib.library.Catalogue.scan_folder is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:45: warning: Member books_per_page (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:46: warning: Member current_page (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:47: warning: Member thumbnail_size (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:48: warning: Member thumbnail_scale (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:49: warning: Member total_pages (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:51: warning: Member screen_size (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:40: warning: parameters of member src.backend.lib.pyShelf.BookDisplay.__init__ are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:73: warning: parameters of member src.backend.lib.pyShelf.BookDisplay.booksPerPage are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:73: warning: return type of member src.backend.lib.pyShelf.BookDisplay.booksPerPage is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:55: warning: return type of member src.backend.lib.pyShelf.BookDisplay.nextPage is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:64: warning: return type of member src.backend.lib.pyShelf.BookDisplay.previousPage is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:15: warning: Member __init__(self, file_array) (function) of class src::backend::lib::pyShelf::InitFiles is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:27: warning: parameters of member src.backend.lib.pyShelf.InitFiles.CreateFile are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:27: warning: return type of member src.backend.lib.pyShelf.InitFiles.CreateFile is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:10: warning: Member __init__(self, config) (function) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:22: warning: Member check_ownership(self, table=None) (function) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:116: warning: Member make_collections(self) (function) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:11: warning: Member sql (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:12: warning: Member user (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:13: warning: Member password (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:14: warning: Member db_host (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:15: warning: Member db_port (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:16: warning: Member db (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:19: warning: Member config (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:20: warning: Member cursor (variable) of class src::backend::lib::storage::Storage is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:86: warning: return type of member src.backend.lib.storage.Storage.book_paths_list is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:109: warning: return type of member src.backend.lib.storage.Storage.close is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:99: warning: return type of member src.backend.lib.storage.Storage.commit is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:40: warning: return type of member src.backend.lib.storage.Storage.create_tables is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:51: warning: parameters of member src.backend.lib.storage.Storage.insert_book are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:51: warning: return type of member src.backend.lib.storage.Storage.insert_book is not documented -/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:9: warning: Member test_book_dir(self) (function) of class src::backend::tests::config_test::TestConfig is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:12: warning: Member test_title(self) (function) of class src::backend::tests::config_test::TestConfig is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:15: warning: Member test_version(self) (function) of class src::backend::tests::config_test::TestConfig is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:7: warning: Member config (variable) of class src::backend::tests::config_test::TestConfig is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:20: warning: Member __init__(self) (function) of class src::backend::tests::library_test::Test_Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:74: warning: Member process_by_filetype(self, book) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:177: warning: Member extract_metadata_mobi(self, book) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:173: warning: Member stripTags(source) (function) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:24: warning: Member book_shelf (variable) of class src::backend::tests::library_test::Test_Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member file_list (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member opf_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member cover_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member html_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:29: warning: Member title_sanitization_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:30: warning: Member title_sanitization_lvl2_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member title_sanitization_dirs_regx (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member root_dir (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member book_folder (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:34: warning: Member books (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:35: warning: Member db_pointer (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:36: warning: Member config (variable) of class src::backend::lib::library::Catalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:249: warning: return type of member src.backend.lib.library.Catalogue.compare_shelf_current is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:224: warning: parameters of member src.backend.lib.library.Catalogue.extract_content are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:224: warning: return type of member src.backend.lib.library.Catalogue.extract_content is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:231: warning: parameters of member src.backend.lib.library.Catalogue.extract_cover_html are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:231: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_html is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:238: warning: parameters of member src.backend.lib.library.Catalogue.extract_cover_image are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:238: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_image is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:99: warning: parameters of member src.backend.lib.library.Catalogue.extract_metadata_epub are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:99: warning: return type of member src.backend.lib.library.Catalogue.extract_metadata_epub is not documented -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:23: warning: return type of member src.backend.tests.library_test.Test_Catalogue.filter_books is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:267: warning: parameters of member src.backend.lib.library.Catalogue.import_books are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:267: warning: return type of member src.backend.lib.library.Catalogue.import_books is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:83: warning: parameters of member src.backend.lib.library.Catalogue.process_epub are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:83: warning: return type of member src.backend.lib.library.Catalogue.process_epub is not documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:38: warning: parameters of member src.backend.lib.library.Catalogue.scan_folder are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/lib/library.py:38: warning: return type of member src.backend.lib.library.Catalogue.scan_folder is not documented -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:9: warning: Member __init__(self) (function) of class src::backend::tests::library_test::Test_Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:50: warning: Member django_secret(self, _data) (function) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:20: warning: Member book_path (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:21: warning: Member TITLE (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:22: warning: Member VERSION (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:24: warning: Member book_shelf (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:25: warning: Member catalogue_db (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:26: warning: Member user (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:27: warning: Member password (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:28: warning: Member db_host (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:29: warning: Member db_port (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:30: warning: Member file_array (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:33: warning: Member root (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:34: warning: Member auto_scan (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:36: warning: Member allowed_hosts (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:37: warning: Member db_user (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:38: warning: Member db_pass (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/lib/config.py:40: warning: Member SECRET (variable) of class src::backend::lib::config::Config is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:13: warning: parameters of member src.backend.tests.library_test.Test_Config.open_file are not (all) documented -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:13: warning: return type of member src.backend.tests.library_test.Test_Config.open_file is not documented -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:32: warning: Member test_filter_books(self) (function) of class src::backend::tests::library_test::TestCatalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:29: warning: Member root (variable) of class src::backend::tests::library_test::TestCatalogue is not documented. -/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:30: warning: Member config (variable) of class src::backend::tests::library_test::TestCatalogue is not documented. From f2729e05dbebaad4ddd9bb1681331d4d66518d5e Mon Sep 17 00:00:00 2001 From: th3r00t Date: Tue, 25 Aug 2020 13:59:06 -0400 Subject: [PATCH 10/12] Implemented new logging functions, refactored to suit. --- pyShelf.py | 30 +++++++----------- requirements.txt | 1 + src/backend/lib/config.py | 43 +++++++++++++------------- src/backend/lib/library.py | 14 +++------ src/backend/lib/pyShelf.py | 9 ++---- src/backend/lib/storage.py | 13 +++++--- src/backend/pyShelf_MakeCollections.py | 8 ++--- src/backend/pyShelf_ScanLibrary.py | 8 ++--- src/frontend/settings.py | 2 +- 9 files changed, 59 insertions(+), 69 deletions(-) mode change 100644 => 100755 pyShelf.py diff --git a/pyShelf.py b/pyShelf.py old mode 100644 new mode 100755 index f6f61e2..7f5d7bd --- a/pyShelf.py +++ b/pyShelf.py @@ -1,13 +1,14 @@ #!/usr/bin/env python3 import asyncio -import websockets import sys from pathlib import Path -from loguru import logger -from src.backend.lib.config import Config -from src.backend.pyShelf_ScanLibrary import execute_scan -from src.backend.pyShelf_MakeCollections import MakeCollections +import websockets +from loguru import logger + +from src.backend.lib.config import Config +from src.backend.pyShelf_MakeCollections import MakeCollections +from src.backend.pyShelf_ScanLibrary import execute_scan root = Path.cwd() config = Config(root) @@ -18,34 +19,27 @@ tx = None async def runImport(): - execute_scan(PRG_PATH) - MakeCollections(PRG_PATH) + execute_scan(PRG_PATH, config=config) + MakeCollections(PRG_PATH, config=config) return "Import Complete" async def socketio(websocket, path): async for message in websocket: - if message == "import": - print("message from Con1 >> {}".format(message)) - tx = "ack->{}".format(message) - elif message == "Connection 2": - print("message from Con2 >> {}".format(message)) - tx = "ack->{}".format(message) - elif message == "ping": - print("<<[{}]".format(message)) + if message == "ping": + config.logger.info("<< Ping") tx = pong(message) elif message == "importBooks": - print("<<[{} cmd rcvd]\n Starting import".format(message)) + config.logger.info("Starting Import") tx = "Starting Import . . ." await websocket.send(tx) await runImport() tx = "complete" - await websocket.send(tx) def pong(message): - print('Ping Received') + config.logger.info(">> Pong") return "pong" diff --git a/requirements.txt b/requirements.txt index eaa8f3e..2cdef29 100755 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,4 @@ uwsgi jsonpickle django-widget-tweaks loguru +ptvsd diff --git a/src/backend/lib/config.py b/src/backend/lib/config.py index 69acc6a..026feb8 100755 --- a/src/backend/lib/config.py +++ b/src/backend/lib/config.py @@ -1,5 +1,6 @@ import json import pathlib + from loguru import logger @@ -8,49 +9,49 @@ class Config: Main System Configuration """ - _fp = "config.json" def __init__(self, root): """ Initialize main configuration options """ - _cp = pathlib.Path.joinpath(root, self._fp) - _data = self.open_file(_cp) + self._fp = "config.json" + self._cp = pathlib.Path.joinpath(root, self._fp) + self._data = self.open_file() self.root = root self.logger = self.get_logger() - self.book_path = _data["BOOKPATH"] - self.TITLE = _data["TITLE"] - self.VERSION = _data["VERSION"] + self.book_path = self._data["BOOKPATH"] + self.TITLE = self._data["TITLE"] + self.VERSION = self._data["VERSION"] self.TITLE = self.TITLE + " ver " + self.VERSION - self.book_shelf = _data["BOOKSHELF"] - self.catalogue_db = _data["DATABASE"] - self.user = _data["USER"] - self.password = _data["PASSWORD"] - self.db_host = _data["DB_HOST"] - self.db_port = _data["DB_PORT"] + self.book_shelf = self._data["BOOKSHELF"] + self.catalogue_db = self._data["DATABASE"] + self.user = self._data["USER"] + self.password = self._data["PASSWORD"] + self.db_host = self._data["DB_HOST"] + self.db_port = self._data["DB_PORT"] self.file_array = [ self.book_shelf, ] self.auto_scan = True - self.allowed_hosts = _data["ALLOWED_HOSTS"] - self.db_user = _data["USER"] - self.db_pass = _data["PASSWORD"] - self.SECRET = _data["SECRET"] + self.allowed_hosts = self._data["ALLOWED_HOSTS"] + self.db_user = self._data["USER"] + self.db_pass = self._data["PASSWORD"] + self.SECRET = self._data["SECRET"] def get_logger(self): _logger = logger - _logger.add(pathlib.PurePath(self.root, 'data','pyShelf_{time}.log'), rotation="10 MB", loop=None) + _logger.add(pathlib.PurePath(self.root, 'data','pyShelf_{time}.log'), + rotation="10 MB", enqueue=True, colorize=True) return _logger - @staticmethod - def open_file(_cp): + def open_file(self): """ Opens config.json and reads in configuration options """ - with open(str(_cp), "r") as read_file: + with open(str(self._cp), "r") as read_file: data = json.load(read_file) return data - def django_secret(self, _data): + def django_secret(self): pass diff --git a/src/backend/lib/library.py b/src/backend/lib/library.py index 353809f..145d00e 100755 --- a/src/backend/lib/library.py +++ b/src/backend/lib/library.py @@ -6,7 +6,6 @@ import re import zipfile from bs4 import BeautifulSoup - from mobi import Mobi from .api_hooks import DuckDuckGo @@ -14,7 +13,6 @@ from .config import Config from .storage import Storage - class Catalogue: """ Decodes book metadata for storage @@ -50,8 +48,6 @@ class Catalogue: self.file_list.append(self.scan_folder(_path)) else: self.file_list.append(_path) - self.config.logger.info(_path) - print(_path+"\n") def filter_books(self): """ @@ -65,7 +61,7 @@ class Catalogue: try: self.books = list(filter(regx.search, filter(None, self.file_list))) except TypeError as e: - print(e) + self.config.logger.error(e) """ for book in self.books: self._book_list_expanded[book] = self.process_by_filetype(book) @@ -73,8 +69,6 @@ class Catalogue: """ def process_by_filetype(self, book): - - print(str(book), end='\r', flush=True) if book.endswith(".epub"): epub = self.process_epub(book) return self.extract_metadata_epub(epub) @@ -210,6 +204,7 @@ class Catalogue: # ftags = ftags.replace(" ", ",") except KeyError: ftags = None + return [ title, author, @@ -286,7 +281,6 @@ class Catalogue: db.insert_book(book) inserted = db.commit() if inserted is not True: - print(inserted) - if input("Continue ? y/n") == "y": - pass + self.config.logger.error("Failed storing {} in database".format(str(book))) + pass db.close() diff --git a/src/backend/lib/pyShelf.py b/src/backend/lib/pyShelf.py index e29d542..f211e28 100755 --- a/src/backend/lib/pyShelf.py +++ b/src/backend/lib/pyShelf.py @@ -1,8 +1,10 @@ #!/usr/bin/env python3 +import asyncio import os import time -import asyncio + import websockets + from .config import Config from .storage import Storage @@ -11,16 +13,11 @@ class InitFiles: """First run file creation operations""" def __init__(self, file_array): - print("Checking for program files") for _pointer in file_array: time.sleep(1) if not os.path.isfile(_pointer): self.CreateFile(_pointer) - print("%s created" % _pointer) - else: - print("%s present" % _pointer) time.sleep(1) - print("File check complete.") def CreateFile(self, _pointer): """ diff --git a/src/backend/lib/storage.py b/src/backend/lib/storage.py index f82c1ec..6052f32 100755 --- a/src/backend/lib/storage.py +++ b/src/backend/lib/storage.py @@ -1,6 +1,7 @@ #!/usr/bin/python -import re import datetime +import re + import psycopg2 @@ -34,7 +35,7 @@ class Storage: set_perms.cursor.execute(_q) set_perms.close() except Exception as e: - print(e) + self.config.logger.error(e) set_perms.close() def create_tables(self): @@ -71,11 +72,12 @@ class Storage: book[4], # descr book[5], # ident book[6], # publisher - datetime.datetime.now(), + datetime.datetime.now(), book[8], # rights book[9], # tags ), ) + self.config.logger.info(book[0]) return True except Exception as e: if e.pgcode == '22007': # psycopg2's error code for invalid date @@ -92,7 +94,7 @@ class Storage: try: x = self.cursor.fetchall() except psycopg2.Error as e: - print(e) + self.config.logger.error(e) x = [] return x @@ -146,8 +148,9 @@ class Storage: (collection, book_id_id) VALUES ('%s',%s)""" % (_s, book[0]) ) + self.config.logger.info("Collection {} Added".format(_s)) except Exception as e: - print(e) + self.config.logger.error(e) _collections.append(_p) self.db.commit() self.close() diff --git a/src/backend/pyShelf_MakeCollections.py b/src/backend/pyShelf_MakeCollections.py index 139e394..18e69ca 100755 --- a/src/backend/pyShelf_MakeCollections.py +++ b/src/backend/pyShelf_MakeCollections.py @@ -11,13 +11,13 @@ from .lib.storage import Storage sys.path.append(os.path.abspath(".")) -def MakeCollections(root): +def MakeCollections(root, **kwargs): _t1 = time.time() - config = Config(root) # Get configuration settings + try: config = kwargs['config'] + except KeyError as e: config = Config(root) # InitFiles(config.file_array) # Initialize file system _storage = Storage(config) _storage.make_collections() _t2 = time.time() scan_time = round(_t2 - _t1) - print("Collections Made.") - print("Time %s seconds" % scan_time) + config.logger.info("Collections made in {}".format(scan_time)) diff --git a/src/backend/pyShelf_ScanLibrary.py b/src/backend/pyShelf_ScanLibrary.py index b8c5c33..53c2cc8 100755 --- a/src/backend/pyShelf_ScanLibrary.py +++ b/src/backend/pyShelf_ScanLibrary.py @@ -11,18 +11,18 @@ from .lib.storage import Storage sys.path.append(os.path.abspath(".")) -def execute_scan(root): +def execute_scan(root, **kwargs): """ Main scan execution :param root: Project root. Required to properly execute program. Sends to configuration. """ _t1 = time.time() - config = Config(root) # Get configuration settings + try: config = kwargs["config"]; + except KeyError as e: config = Config(root) # Get configuration settings InitFiles(config.file_array) # Initialize file system Storage(config).check_ownership() catalogue = Catalogue(config) # Open the Catalogue catalogue.import_books() _t2 = time.time() scan_time = round(_t2 - _t1) - print("Scan Completed.") - print("Scan Time %s seconds" % scan_time) + config.logger.info("Scan Completed in {} seconds".format(scan_time)) diff --git a/src/frontend/settings.py b/src/frontend/settings.py index 0cb56e8..6dfdac1 100755 --- a/src/frontend/settings.py +++ b/src/frontend/settings.py @@ -32,7 +32,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = CONFIG.SECRET # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = TEMPLATE_DEBUG = False +DEBUG = TEMPLATE_DEBUG = True if DEBUG is True: from pudb.remote import set_trace ALLOWED_HOSTS = CONFIG.allowed_hosts From 938ef398210b622423d3ab406151831a62f53873 Mon Sep 17 00:00:00 2001 From: th3r00t Date: Fri, 28 Aug 2020 22:22:16 -0400 Subject: [PATCH 11/12] Began implementing on-demand websocket server --- src/backend/lib/config.py | 8 ++++- src/backend/lib/pyShelf.py | 49 ++++++++++++++++++------- src/interface/static/js/pyshelf_ux.js | 10 +++++- src/interface/views.py | 52 ++++++++++++++++++--------- 4 files changed, 87 insertions(+), 32 deletions(-) diff --git a/src/backend/lib/config.py b/src/backend/lib/config.py index 026feb8..2bacdfd 100755 --- a/src/backend/lib/config.py +++ b/src/backend/lib/config.py @@ -1,5 +1,6 @@ import json import pathlib +import re from loguru import logger @@ -14,10 +15,10 @@ class Config: """ Initialize main configuration options """ + self.root = root self._fp = "config.json" self._cp = pathlib.Path.joinpath(root, self._fp) self._data = self.open_file() - self.root = root self.logger = self.get_logger() self.book_path = self._data["BOOKPATH"] self.TITLE = self._data["TITLE"] @@ -53,5 +54,10 @@ class Config: data = json.load(read_file) return data + def path(self): + rstr = "pyShelf/src" + r = re.template(rstr) + _pathre = re.match("pyShelf/src") + def django_secret(self): pass diff --git a/src/backend/lib/pyShelf.py b/src/backend/lib/pyShelf.py index f211e28..8a7da21 100755 --- a/src/backend/lib/pyShelf.py +++ b/src/backend/lib/pyShelf.py @@ -1,17 +1,18 @@ #!/usr/bin/env python3 import asyncio import os +import sys import time import websockets from .config import Config +from .library import Catalogue from .storage import Storage class InitFiles: """First run file creation operations""" - def __init__(self, file_array): for _pointer in file_array: time.sleep(1) @@ -35,18 +36,40 @@ class Server: :TODO: Document this """ - def __init__(self): - self.loop = asyncio.get_event_loop() + async def __init__(self, root): + self.root = root + self.config = Config(self.root) self.instance = None + self.serve = await websockets.serve(socketio, "127.0.0.1", 1337) - async def entrypoint(self, websocket, path): - _str = await websocket.recv() - greeting = f"{_str}" - await websocket.send(greeting) + async def __aexit__(self, *args, **kwargs): + await self.serve.__aexit__(*args, **kwargs) - async def start(self): - try: - self.instance = await websockets.serve(self.entrypoint, "localhost", 1337) - return True - except Exception: - raise + async def runImport(self): + _start_time = time.time() + InitFiles(self.config.file_array) + _storage = Storage(self.config) + _storage.check_ownership() + Catalogue(self.config).import_books() + _storage.make_collections() + _total_time = round(time.time() - _start_time) + + async def socketio(self, websocket, path): + async for message in websocket: + if message == "ping": + config.logger.info("<< Ping") + tx = self.pong() + elif message == "importBooks": + config.logger.info("Starting Import") + tx = "Starting Import . . ." + await websocket.send(tx) + await runImport() + tx = "complete" + await websocket.send(tx) + + def pong(self): + self.config.logger.info(">> Pong") + return "pong" + + def start(self): + asyncio.get_event_loop().run_until_complete(self.serve) diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index dd714f1..468281a 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -172,6 +172,14 @@ $(document).ready(function(){ }); $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); $(document).on('click', '.import-btn', async function(){ + $.ajax({ + type: "GET", url: "/live", data: {hook: 'import_books'}, + success: function (response) { + }, + error: function (response) { + customlog(["Failure", response]); + } + }); let connection = await ImportBooks(server); popover.html('
    '); let psout = $('#psout') @@ -286,7 +294,7 @@ function OpenSocket(address) { ping(connection) }; connection.onmessage = function(rcvd){ - sock_rx(rcvd) + sock_rx(rcvd) }; resolve(connection); }); diff --git a/src/interface/views.py b/src/interface/views.py index 6117653..f58cdcb 100755 --- a/src/interface/views.py +++ b/src/interface/views.py @@ -1,13 +1,14 @@ +import asyncio import json import os +import socket +import threading import time -import asyncio - from base64 import b64decode, b64encode from pathlib import Path from backend.lib.config import Config - +from backend.lib.pyShelf import Server from django.conf import settings from django.contrib import auth from django.contrib.auth import authenticate, get_user_model, login, logout @@ -23,7 +24,7 @@ from .forms import SignUpForm, UserLoginForm from .models import Books, Collections, Favorites, Navigation, User config = Config(Path("../")) - +server = None def index(request, query=None, _set=1, _limit=None, _order='title'): @@ -76,7 +77,7 @@ def userlogin(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) - if user is not None: + if user is not None: login(request, user) user.save() return redirect('home') @@ -89,8 +90,8 @@ def userlogout(request): return redirect('home') -def home(request, query=None, _set=1, _limit=None, _order='title'): - """ +def home(request, query=None, _set=1, _limit=None, _order='title'): + """ Reset Search Queries & Return Home """ _payload = payload(request, query, _set, _limit, _order, reset=True) @@ -148,7 +149,7 @@ def show_collection(request, query, _set, _limit=None, _order='title', **kwargs) _bookstats = len(Collections().generic_search(query)) if (_r_len): _btotal = str(_r_len) else: _btotal = str(_bookstats) - + return render( request, "index.html", @@ -235,7 +236,7 @@ def book_set(request, _order, _limit=None, _set=1, _flip=False, **kwargs): _set_min = _set_max - _limit if _flip: books = BookObject.order_by(_order).reverse()[_set_min:_set_max] - else: + else: books = BookObject.order_by(_order)[_set_min:_set_max] return mark_favorites(request, books) @@ -410,14 +411,28 @@ def live(request, **kwargs): return JsonResponse({"data": html}) elif hook == "import_books": + """TODO: Spawn websocket server""" breakpoint() - filename = "../data/{}-{}.sock".format(request.user.username, time.strftime("%H:%M:%S")) - catalogue = ACatalogue() - async def responder(socket): - await catalogue.import_books(socket=socket) - return JsonResponse({"data": filename}) - asyncio.run(responder(filename)) - + ################################################### + # async def responder(socket): # + # await catalogue.import_books(socket=socket) # + # return JsonResponse({"data": None}) # + # pass # + # asyncio.run(responder(None)) # + ################################################### + def test_connection(host): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect(host) + s.sendall(b"ping") + data = s.recv(1024) + return data + _host = ("127.0.0.1", 1337) + try: + _server_response = test_connection(_host) + except ConnectionRefusedError as e: + config.logger.info(e) + if e.errno == 111: + request.server = Server(Path.absolute(Path.cwd().parent)).start() else: return JsonResponse(err_txt, status=404) @@ -494,7 +509,7 @@ def payload(request, query, _set, _limit, _order, **kwargs): _r = book_set(request, _order, _limit, _set, False, **kwargs) else: _r = book_set(request, _order, _limit, _set, True, **kwargs) _r_len, _search = None, None - + _bookstats = Books.objects.all().count() if (_r_len): _btotal = str(_r_len) else: _btotal = str(_bookstats) @@ -513,3 +528,6 @@ def payload(request, query, _set, _limit, _order, **kwargs): "SearchLen": _r_len, "Order": _order, } + +def start_server(request, **kwargs): + pass From 85fa88dcb0d9132a85b6d766e236e348ee4856db Mon Sep 17 00:00:00 2001 From: th3r00t Date: Wed, 2 Sep 2020 17:42:08 -0400 Subject: [PATCH 12/12] On demand import functionality, held together with ductape and bubblegum. --- pyShelf.py | 2 +- requirements.txt | 1 + src/backend/lib/config.py | 12 ++-- src/backend/lib/pyShelf.py | 31 +++++++--- src/interface/static/js/pyshelf_ux.js | 87 +++++++-------------------- src/interface/views.py | 57 ++++++++++++------ 6 files changed, 91 insertions(+), 99 deletions(-) diff --git a/pyShelf.py b/pyShelf.py index 7f5d7bd..f9f034b 100755 --- a/pyShelf.py +++ b/pyShelf.py @@ -4,7 +4,6 @@ import sys from pathlib import Path import websockets -from loguru import logger from src.backend.lib.config import Config from src.backend.pyShelf_MakeCollections import MakeCollections @@ -26,6 +25,7 @@ async def runImport(): async def socketio(websocket, path): async for message in websocket: + config.logger.info("Message Processing") if message == "ping": config.logger.info("<< Ping") tx = pong(message) diff --git a/requirements.txt b/requirements.txt index 2cdef29..987a1bb 100755 --- a/requirements.txt +++ b/requirements.txt @@ -23,3 +23,4 @@ jsonpickle django-widget-tweaks loguru ptvsd +pudb \ No newline at end of file diff --git a/src/backend/lib/config.py b/src/backend/lib/config.py index 2bacdfd..fcb590b 100755 --- a/src/backend/lib/config.py +++ b/src/backend/lib/config.py @@ -19,7 +19,8 @@ class Config: self._fp = "config.json" self._cp = pathlib.Path.joinpath(root, self._fp) self._data = self.open_file() - self.logger = self.get_logger() + try: self.logger + except AttributeError: self.logger = self.get_logger() self.book_path = self._data["BOOKPATH"] self.TITLE = self._data["TITLE"] self.VERSION = self._data["VERSION"] @@ -30,11 +31,8 @@ class Config: self.password = self._data["PASSWORD"] self.db_host = self._data["DB_HOST"] self.db_port = self._data["DB_PORT"] - self.file_array = [ - self.book_shelf, - ] + self.file_array = [self.book_shelf] self.auto_scan = True - self.allowed_hosts = self._data["ALLOWED_HOSTS"] self.db_user = self._data["USER"] self.db_pass = self._data["PASSWORD"] @@ -42,8 +40,8 @@ class Config: def get_logger(self): _logger = logger - _logger.add(pathlib.PurePath(self.root, 'data','pyShelf_{time}.log'), - rotation="10 MB", enqueue=True, colorize=True) + _logger.add(pathlib.PurePath(self.root, 'data','{time}.log'), + rotation="2 MB", enqueue=True, colorize=True) return _logger def open_file(self): diff --git a/src/backend/lib/pyShelf.py b/src/backend/lib/pyShelf.py index 8a7da21..43d9ef4 100755 --- a/src/backend/lib/pyShelf.py +++ b/src/backend/lib/pyShelf.py @@ -36,15 +36,22 @@ class Server: :TODO: Document this """ - async def __init__(self, root): + def __init__(self, root): self.root = root + self.host = ("127.0.0.1", 1337) self.config = Config(self.root) - self.instance = None - self.serve = await websockets.serve(socketio, "127.0.0.1", 1337) + self.loop = None + self.serve = None async def __aexit__(self, *args, **kwargs): await self.serve.__aexit__(*args, **kwargs) + async def initialize_server(self): + self.config.logger.info("INITIALIZE") + self.serve = await websockets.serve(self.socketio, self.host[0], self.host[1]) + await asyncio.sleep(.01) + self.config.logger.info("Server Initialization Complete") + async def runImport(self): _start_time = time.time() InitFiles(self.config.file_array) @@ -55,21 +62,29 @@ class Server: _total_time = round(time.time() - _start_time) async def socketio(self, websocket, path): + self.config.logger.info("Listener Starting") async for message in websocket: if message == "ping": - config.logger.info("<< Ping") + self.config.logger.info("<< Ping") tx = self.pong() elif message == "importBooks": - config.logger.info("Starting Import") + self.config.logger.info("Starting Import") tx = "Starting Import . . ." await websocket.send(tx) - await runImport() + await asyncio.sleep(0.01) + await self.runImport() + await asyncio.sleep(0.01) tx = "complete" + else: + self.config.logger.info("Unhandled Message Rcvd :: {}".format(message)) await websocket.send(tx) def pong(self): self.config.logger.info(">> Pong") return "pong" - def start(self): - asyncio.get_event_loop().run_until_complete(self.serve) + async def start(self): + self.loop = asyncio.get_running_loop() + self.loop.set_debug(True) + await websockets.serve(self.socketio, self.host[0], self.host[1]) + await asyncio.sleep(1) diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 468281a..c17b1fb 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -1,3 +1,13 @@ + +async function WebSocketInterface(host) { + let socket = new WebSocket(host) + socket.onopen = function(e) { console.log('Connected') } + socket.onmessage = function (rcvd){ + rx_msg(rcvd.data) + }} +async function rx_msg(rcvd) { console.log('msg :: '+rcvd) } +async function tx_msg(socket, msg) { socket.send(msg) } + $(document).ready(function(){ function customlog(outstream) { /* Gather my variables and output them */ @@ -171,16 +181,9 @@ $(document).ready(function(){ $('#pop_over_0').dialog("open"); }); $(document).on('click', '.logout-btn', function(){window.location.href = '/logout'}); + + //Web Socket Call $(document).on('click', '.import-btn', async function(){ - $.ajax({ - type: "GET", url: "/live", data: {hook: 'import_books'}, - success: function (response) { - }, - error: function (response) { - customlog(["Failure", response]); - } - }); - let connection = await ImportBooks(server); popover.html('
    '); let psout = $('#psout') psout.append('
    Importing Books
    ') @@ -192,6 +195,16 @@ $(document).ready(function(){ value: false }); $(".progressbar").append("
    ") + $.ajax({ + type: "GET", url: "/live", data: {hook: 'import_books'}, + success: async function (response,sock) { + customlog(["Backend Reports websocket server READY"]) + $('.progressbar').progressbar({ value: true }) + }, + error: function (response) { + customlog(["Failure", response.data]); + } + }); }); $('#coll_button').on('click', function(){ var isopen = $('#pop_over_0').dialog("isOpen"); @@ -285,59 +298,3 @@ function resize_search(win_width){ $('.search_string').val("Search"); } } - -function OpenSocket(address) { - return new Promise(resolve => { - const connection = new WebSocket(address); - connection.onopen = function(e){ - console.log('--[ Connection Established ]') - ping(connection) - }; - connection.onmessage = function(rcvd){ - sock_rx(rcvd) - }; - resolve(connection); - }); -} - -function ImportBooks(address) { - return new Promise(resolve => { - const connection = new WebSocket(address); - connection.onopen = function(e){ - sock_tx(connection,'importBooks') - }; - connection.onmessage = function(rcvd){ - sock_rx(rcvd) - }; - resolve(connection); - }); -} - -async function PyshelfServer(address){ - console.log("--[ Starting Connection ]") - return await OpenSocket(address) -} -function sock_rx(rcvd) { - if (rcvd.data == 'pong') { pong(rcvd) } - else if (rcvd.data == 'complete') { - $('.progressbar').progressbar("option", "value", "True"); - $('.import_status').html('Import Complete') - console.log(rcvd.data) - } - else { console.log("<<[rx] :"+rcvd.data) } -} -function sock_tx(connection, msg) { - connection.send(msg); -} -function sock_status(connection) { - let buffered = connection.bufferedAmmount; - let ready = connection.readyState; - return [buffered, ready]; -} -function ping(connection) { - connection.send('ping'); - console.log("[ping]>>"); -} -function pong(rcvd) { - console.log("<<["+rcvd+"]") -} diff --git a/src/interface/views.py b/src/interface/views.py index f58cdcb..6494390 100755 --- a/src/interface/views.py +++ b/src/interface/views.py @@ -7,6 +7,7 @@ import time from base64 import b64decode, b64encode from pathlib import Path +import websockets from backend.lib.config import Config from backend.lib.pyShelf import Server from django.conf import settings @@ -384,7 +385,7 @@ def collections_list(): return list(set(collection_key)) -def live(request, **kwargs): +async def live(request, **kwargs): """ Respond to live requests. Primarily used as a response object for Ajax calls :param GET['hook']: collection_listing, book_details, register @@ -411,33 +412,53 @@ def live(request, **kwargs): return JsonResponse({"data": html}) elif hook == "import_books": - """TODO: Spawn websocket server""" - breakpoint() - ################################################### - # async def responder(socket): # - # await catalogue.import_books(socket=socket) # - # return JsonResponse({"data": None}) # - # pass # - # asyncio.run(responder(None)) # - ################################################### - def test_connection(host): - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.connect(host) - s.sendall(b"ping") - data = s.recv(1024) - return data + _test_count = 0 + await Server(Path.absolute(Path.cwd().parent)).start() + await asyncio.sleep(1) + + async def test_connection(host, counter): + async with websockets.connect(f'ws://{host[0]}:{host[1]}') as _s: + await _s.send("ping") + data = await _s.recv() + counter = counter + 1 + if data == "pong": + return True + else: + return False + + async def runImport(host): + async with websockets.connect(f'ws://{host[0]}:{host[1]}') as _s: + await _s.send("importBooks") + data = await _s.recv() + if data == "complete": + return JsonResponse({"data": data}) + else: + return False + _host = ("127.0.0.1", 1337) + _test_count = 0 try: - _server_response = test_connection(_host) + if await test_connection(_host, _test_count): + config.logger.info("Connection Successful") + await runImport(_host) + return JsonResponse({"data": "Response sent"}, status=200) except ConnectionRefusedError as e: config.logger.info(e) if e.errno == 111: - request.server = Server(Path.absolute(Path.cwd().parent)).start() + await Server(Path.absolute(Path.cwd().parent)).start() + if await test_connection(_host, _test_count): + return JsonResponse({"data": "Response sent"}, status=200) + elif not await test_connection(_host, _test_count) & _test_count >=4: + await Server(Path.absolute(Path.cwd().parent)).start() + await test_connection(_host, _test_count) + else: + return JsonResponse({"data": "Websocket Failed Testing"}, status=401) else: return JsonResponse(err_txt, status=404) return JsonResponse({"data": "Response sent"}, status=200) + def book_details(book): return { 'title': book.title,