From 563d9cc96da9f5aa394ba0da7b7fffd86bd8b428 Mon Sep 17 00:00:00 2001 From: Matt Jenkins Date: Thu, 4 Jun 2026 11:13:34 +0100 Subject: [PATCH] Initial import --- Makefile | 10 + app.php | 172 ++++++++ app/controllers/CoverController.php | 66 +++ app/controllers/DocumentController.php | 561 ++++++++++++++++++++++++ app/controllers/DownloadController.php | 31 ++ app/controllers/FavouriteController.php | 33 ++ app/controllers/HomeController.php | 7 + app/controllers/ImportController.php | 78 ++++ app/controllers/JobController.php | 23 + app/controllers/PDFController.php | 57 +++ app/controllers/ProductController.php | 164 +++++++ app/controllers/RevisionController.php | 107 +++++ app/controllers/SearchController.php | 76 ++++ app/controllers/SitemapController.php | 9 + app/controllers/SpiderController.php | 83 ++++ app/controllers/SystemController.php | 140 ++++++ app/jobs/DownloadJob.php | 87 ++++ app/jobs/GeminiJob.php | 211 +++++++++ app/jobs/ImportGeminiJob.php | 182 ++++++++ app/jobs/ImportOCRJob.php | 67 +++ app/jobs/IndexJob.php | 47 ++ app/jobs/OCRJob.php | 43 ++ app/jobs/ProcessJob.php | 18 + app/jobs/RecompressJob.php | 35 ++ app/jobs/RedownloadJob.php | 59 +++ app/models/DocMeta.php | 13 + app/models/DocProduct.php | 17 + app/models/Document.php | 209 +++++++++ app/models/Favourite.php | 4 + app/models/IDMatch.php | 51 +++ app/models/MetaType.php | 11 + app/models/OCR.php | 23 + app/models/Product.php | 163 +++++++ app/models/Revision.php | 123 ++++++ app/models/Spider.php | 4 + app/models/SpiderBanned.php | 4 + app/models/SpiderDom.php | 4 + app/models/SpiderPage.php | 5 + app/models/System.php | 23 + app/models/SystemDoc.php | 5 + app/models/Upload.php | 8 + app/models/User.php | 43 ++ backend/JobRunner | 45 ++ backend/JobRunnerQuit | 5 + composer.json | 7 + decpdf/Dockerfile | 54 +++ decpdf/app.py | 23 + decpdf/boot | 9 + decpdf/build | 12 + decpdf/compose.yaml | 30 ++ decpdf/memory.ini | 3 + decpdf/policy.xml | 98 +++++ dot.env.sample | 15 + lib/AntiSpam.php | 12 + lib/App.php | 77 ++++ lib/Auth.php | 183 ++++++++ lib/Collection.php | 193 ++++++++ lib/Config.php | 32 ++ lib/DB.php | 141 ++++++ lib/ErrorHandler.php | 103 +++++ lib/File.php | 128 ++++++ lib/Form.php | 44 ++ lib/Gemini.php | 289 ++++++++++++ lib/GeminiParameter.php | 55 +++ lib/HTTPRequest.php | 112 +++++ lib/Image.php | 124 ++++++ lib/Job.php | 157 +++++++ lib/Model.php | 501 +++++++++++++++++++++ lib/PDF.php | 165 +++++++ lib/Process.php | 82 ++++ lib/Query.php | 112 +++++ lib/Request.php | 112 +++++ lib/Route.php | 112 +++++ lib/Routes.php | 37 ++ lib/Session.php | 71 +++ lib/Text.php | 39 ++ package.json | 21 + public/d192.png | Bin 0 -> 2483 bytes public/d512.png | Bin 0 -> 7406 bytes public/favicon.ico | Bin 0 -> 5798 bytes public/index.php | 3 + public/logo.png | Bin 0 -> 276254 bytes public/manifest.webmanifest | 20 + routes/api.php | 77 ++++ routes/web.php | 110 +++++ src/.vue | 24 + src/DDDiv.vue | 90 ++++ src/DocumentEdit.vue | 195 ++++++++ src/Download.vue | 127 ++++++ src/DownloadManager.vue | 76 ++++ src/IDMatch.vue | 249 +++++++++++ src/Imports.vue | 550 +++++++++++++++++++++++ src/InlineEdit.vue | 85 ++++ src/InlineEditText.vue | 114 +++++ src/ItemAdder.vue | 87 ++++ src/JobDisplay.vue | 83 ++++ src/KeyboardInteraction.vue | 34 ++ src/PDF.vue | 89 ++++ src/PDFList.vue | 123 ++++++ src/ProductControls.vue | 188 ++++++++ src/ProductSelector.vue | 172 ++++++++ src/Search.vue | 85 ++++ src/SpiderPages.vue | 79 ++++ src/StarRating.vue | 73 +++ src/Template.vue | 24 + src/app.css | 27 ++ src/app.js | 54 +++ src/app.scss | 0 views/404.blade.php | 8 + views/account.blade.php | 94 ++++ views/document.blade.php | 165 +++++++ views/documents.blade.php | 140 ++++++ views/downloads.blade.php | 4 + views/favourites.blade.php | 16 + views/forms/input.blade.php | 4 + views/forms/password.blade.php | 4 + views/forms/submit.blade.php | 5 + views/idmatch.blade.php | 4 + views/imports.blade.php | 4 + views/index.blade.php | 46 ++ views/layout/main.blade.php | 123 ++++++ views/loggedin.blade.php | 4 + views/login.blade.php | 19 + views/privacy.blade.php | 23 + views/register.blade.php | 21 + views/revision.blade.php | 89 ++++ views/search.blade.php | 74 ++++ views/simple_table.blade.php | 10 + views/sitemap.blade.php | 20 + views/spider_pages.blade.php | 4 + views/spider_pdfs.blade.php | 4 + views/status.blade.php | 27 ++ views/system.blade.php | 32 ++ views/systems.blade.php | 18 + views/systems_add.blade.php | 34 ++ views/thumbnail-50.blade.php | 95 ++++ views/thumbnail.blade.php | 97 ++++ views/thumbnail_title.blade.php | 84 ++++ views/upload/attachment.blade.php | 20 + views/upload/document.blade.php | 20 + views/upload/duplicate.blade.php | 8 + views/upload/list.blade.php | 78 ++++ webpack.config.js | 57 +++ 143 files changed, 10572 insertions(+) create mode 100644 Makefile create mode 100755 app.php create mode 100644 app/controllers/CoverController.php create mode 100644 app/controllers/DocumentController.php create mode 100644 app/controllers/DownloadController.php create mode 100644 app/controllers/FavouriteController.php create mode 100644 app/controllers/HomeController.php create mode 100644 app/controllers/ImportController.php create mode 100644 app/controllers/JobController.php create mode 100644 app/controllers/PDFController.php create mode 100644 app/controllers/ProductController.php create mode 100644 app/controllers/RevisionController.php create mode 100644 app/controllers/SearchController.php create mode 100644 app/controllers/SitemapController.php create mode 100644 app/controllers/SpiderController.php create mode 100644 app/controllers/SystemController.php create mode 100644 app/jobs/DownloadJob.php create mode 100644 app/jobs/GeminiJob.php create mode 100644 app/jobs/ImportGeminiJob.php create mode 100644 app/jobs/ImportOCRJob.php create mode 100644 app/jobs/IndexJob.php create mode 100644 app/jobs/OCRJob.php create mode 100644 app/jobs/ProcessJob.php create mode 100644 app/jobs/RecompressJob.php create mode 100644 app/jobs/RedownloadJob.php create mode 100644 app/models/DocMeta.php create mode 100644 app/models/DocProduct.php create mode 100644 app/models/Document.php create mode 100644 app/models/Favourite.php create mode 100644 app/models/IDMatch.php create mode 100644 app/models/MetaType.php create mode 100644 app/models/OCR.php create mode 100644 app/models/Product.php create mode 100644 app/models/Revision.php create mode 100644 app/models/Spider.php create mode 100644 app/models/SpiderBanned.php create mode 100644 app/models/SpiderDom.php create mode 100644 app/models/SpiderPage.php create mode 100644 app/models/System.php create mode 100644 app/models/SystemDoc.php create mode 100644 app/models/Upload.php create mode 100644 app/models/User.php create mode 100755 backend/JobRunner create mode 100755 backend/JobRunnerQuit create mode 100755 composer.json create mode 100755 decpdf/Dockerfile create mode 100755 decpdf/app.py create mode 100755 decpdf/boot create mode 100755 decpdf/build create mode 100755 decpdf/compose.yaml create mode 100644 decpdf/memory.ini create mode 100755 decpdf/policy.xml create mode 100644 dot.env.sample create mode 100755 lib/AntiSpam.php create mode 100755 lib/App.php create mode 100755 lib/Auth.php create mode 100755 lib/Collection.php create mode 100755 lib/Config.php create mode 100755 lib/DB.php create mode 100755 lib/ErrorHandler.php create mode 100755 lib/File.php create mode 100755 lib/Form.php create mode 100644 lib/Gemini.php create mode 100644 lib/GeminiParameter.php create mode 100644 lib/HTTPRequest.php create mode 100755 lib/Image.php create mode 100644 lib/Job.php create mode 100755 lib/Model.php create mode 100755 lib/PDF.php create mode 100755 lib/Process.php create mode 100755 lib/Query.php create mode 100755 lib/Request.php create mode 100755 lib/Route.php create mode 100755 lib/Routes.php create mode 100755 lib/Session.php create mode 100644 lib/Text.php create mode 100644 package.json create mode 100644 public/d192.png create mode 100644 public/d512.png create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/logo.png create mode 100644 public/manifest.webmanifest create mode 100644 routes/api.php create mode 100644 routes/web.php create mode 100755 src/.vue create mode 100755 src/DDDiv.vue create mode 100755 src/DocumentEdit.vue create mode 100755 src/Download.vue create mode 100755 src/DownloadManager.vue create mode 100755 src/IDMatch.vue create mode 100755 src/Imports.vue create mode 100755 src/InlineEdit.vue create mode 100755 src/InlineEditText.vue create mode 100644 src/ItemAdder.vue create mode 100755 src/JobDisplay.vue create mode 100644 src/KeyboardInteraction.vue create mode 100755 src/PDF.vue create mode 100755 src/PDFList.vue create mode 100755 src/ProductControls.vue create mode 100755 src/ProductSelector.vue create mode 100755 src/Search.vue create mode 100755 src/SpiderPages.vue create mode 100755 src/StarRating.vue create mode 100755 src/Template.vue create mode 100755 src/app.css create mode 100755 src/app.js create mode 100755 src/app.scss create mode 100644 views/404.blade.php create mode 100644 views/account.blade.php create mode 100644 views/document.blade.php create mode 100755 views/documents.blade.php create mode 100644 views/downloads.blade.php create mode 100644 views/favourites.blade.php create mode 100644 views/forms/input.blade.php create mode 100644 views/forms/password.blade.php create mode 100644 views/forms/submit.blade.php create mode 100644 views/idmatch.blade.php create mode 100644 views/imports.blade.php create mode 100644 views/index.blade.php create mode 100644 views/layout/main.blade.php create mode 100644 views/loggedin.blade.php create mode 100755 views/login.blade.php create mode 100644 views/privacy.blade.php create mode 100644 views/register.blade.php create mode 100644 views/revision.blade.php create mode 100644 views/search.blade.php create mode 100644 views/simple_table.blade.php create mode 100644 views/sitemap.blade.php create mode 100644 views/spider_pages.blade.php create mode 100644 views/spider_pdfs.blade.php create mode 100644 views/status.blade.php create mode 100644 views/system.blade.php create mode 100644 views/systems.blade.php create mode 100644 views/systems_add.blade.php create mode 100644 views/thumbnail-50.blade.php create mode 100644 views/thumbnail.blade.php create mode 100644 views/thumbnail_title.blade.php create mode 100644 views/upload/attachment.blade.php create mode 100644 views/upload/document.blade.php create mode 100644 views/upload/duplicate.blade.php create mode 100644 views/upload/list.blade.php create mode 100644 webpack.config.js diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a479e11 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +.PHONEY: all component live +all: + ./node_modules/webpack/bin/webpack.js + +component: + @if [ -z "$NAME" ]; then echo "Specify NAME="; exit 10 ; fi + @cp src/Template.vue src/${NAME}.vue + +live: all + rsync -avPp * ../docman/ diff --git a/app.php b/app.php new file mode 100755 index 0000000..fa25a5a --- /dev/null +++ b/app.php @@ -0,0 +1,172 @@ +connect( + Config::get("DB_USER"), + Config::get("DB_PASS"), + Config::get("DB_HOST"), + Config::get("DB_DATABASE") +); + +_add_code_dir(ROOT . "/app"); +//$dir = opendir(ROOT . "/app"); +//while ($file = readdir($dir)) { +// if (str_ends_with($file, ".php")) { +// require_once(ROOT . "/app/" . $file); +// } +//} +//closedir($dir); + +require_once("lib/App.php"); + +require_once("routes/api.php"); +require_once("routes/web.php"); + +Model::cache_connect("memcache", 11211); + +if (!is_terminal()) { + $blade = new Blade(ROOT . '/views', ROOT . '/cache'); + $req = new Request; + App::dispatch($req); +} + +function is_terminal() { + return ($_SERVER['argc'] > 0); +} + +function blade($name, $args = []) { + global $blade; + + $args['flash_error'] = Session::get("flash_error"); + $args['flash_warn'] = Session::get("flash_warn"); + $args['flash_success'] = Session::get("flash_info"); + $args['flash_info'] = Session::get("flash_success"); + + Session::unset("flash_error"); + Session::unset("flash_warn"); + Session::unset("flash_info"); + Session::unset("flash_success"); + + return $blade->render($name, $args); +} + +function get_user() { + $uid = Session::get("user"); + if ($uid) { + return new User($uid); + } + return false; +} + +function flash($type, $message) { + if ($_SERVER['argc'] == 0) { + Session::set("flash_" . $type, $message); + } else { + print("$type: $message\n"); + } +} + +function fmt_date($month, $year) { + if (($year < 1900) && ($year > 50)) { + $year = 1900 + $year; + } + + if (($year < 1900) && ($year <= 50)) { + $year = 2000 + $year; + } + + if ($month > 0) { + $dt = DateTime::createFromFormat("!m/Y", $month . "/" . $year); + return $dt->format("F Y"); + } else { + $dt = DateTime::createFromFormat("!Y", $year); + return $dt->format("Y"); + } +} + +function format_size($s) { + if ($s < 102400) return sprintf("%.1fkB", $s / 1024); + if ($s < 10485760) return sprintf("%.1fMB", $s / (1024 * 1024)); + return sprintf("%dMB", $s / (1024 * 1024)); +} + +function redirect($url) { + return [ + 302, "", [ + "Location" => $url + ] + ]; + +// if ($_SERVER['argc'] == 0) { +// header("Location: $url"); +// exit(0); +// } +} + +function jsredirect($url) { + print(''); + exit(0); +} + +function back() { + return redirect($_SERVER['HTTP_REFERER']); +} + +function __unref($v) { + if ($v instanceof Model) { + return $v->id; + } + return $v; +} + +function _add_code_dir($path) { + $dir = opendir($path); + while ($file = readdir($dir)) { + if (str_starts_with($file, ".")) { + continue; + } + + if (is_dir($path . "/" . $file)) { + _add_code_dir($path . "/" . $file); + continue; + } + + if (str_ends_with($file, ".php")) { + require_once($path . "/" . $file); + } + } + closedir($dir); +} + +function strtolower_null($a) { + if (!is_string($a)) return $a; + return strtolower($a); +} diff --git a/app/controllers/CoverController.php b/app/controllers/CoverController.php new file mode 100644 index 0000000..41f8121 --- /dev/null +++ b/app/controllers/CoverController.php @@ -0,0 +1,66 @@ +path(); + + $pdf = new PDF($path . "/doc.pdf"); + if (!$pdf->exists()) { + return [404, "Not Found"]; + } + + if (!$size) { + $imgpath = sprintf("%s/cover.jpg", $path); + } else { + $imgpath = sprintf("%s/cover-%d.jpg", $path, $size); + } + + $file = new File($imgpath); + + if ($file->exists()) { + $h = $file->hash(); + $h = "\"$h\""; + if ($h == $_request->header("If-None-Match")) { + return [304, "Not Modified", [ + "ETag" => $h, + "Cache-Control" => "public, max-age=86400, must-revalidate", + ]]; + } + return new Image($file); + } + + $cover = new Image($path . "/cover.jpg"); + if (!$cover->exists()) { + $pdf->extract_page(0, $cover->path()); + $cover = new Image($path . "/cover.jpg"); + } + + if (!$cover->exists()) { + return [404, "Not Found"]; + } + + if ($size === false) $size = $cover->width(); + + if ($size >= $cover->width()) { + $h = $cover->hash(); + $h = "\"$h\""; + if ($h == $_request->header("If-None-Match")) { + return [304, "Not Modified", [ + "ETag" => $h, + "Cache-Control" => "public, max-age=86400, must-revalidate", + ]]; + } + return $cover; + } + + $cover->scale($size); + $img = $cover->save($imgpath, "image/jpeg"); + return $img; + } + +} diff --git a/app/controllers/DocumentController.php b/app/controllers/DocumentController.php new file mode 100644 index 0000000..639a5ea --- /dev/null +++ b/app/controllers/DocumentController.php @@ -0,0 +1,561 @@ + $product]); + } + + public static function show($id) { + $doc = new Document($id); + $doc->load(); + + return blade("document", [ + "doc" => $doc + ]); + } + + public static function api_get($id) { + return new Document($id); + } + + public static function api_set($id) { + $doc = new Document($id); + if ($doc->valid()) { + foreach ($_POST as $k=>$v) { + if ($k != "products") { + $doc->$k = trim($v); + } + } + $doc->save(); + + $pids = explode(",", $_POST['products']); + + $dpl = DocProduct::find([["document", "=", $id]])->all();; + + foreach ($dpl as $dp) { + $e = array_search($dp->product, $pids); + if ($e !== false) { + unset($pids[$e]); + continue; + } + $dp->delete(); + } + + foreach ($pids as $pid) { + $dp = new DocProduct; + $dp->document = $id; + $dp->product = $pid; + $dp->save(); + } + + $doc->cache_invalidate("products"); + + } + return $doc; + } + + public static function api_get_products($id) { + $doc = new Document($id); + return $doc->products; + } + + public static function api_move($id) { + $doc = new Document($id); + $from = $_POST['from']; + $to = $_POST['to']; + + $dp = DocProduct([["document", "=", $id], ["product", "=", $from]])->first(); + if ($dp) { + $dp->product = $to; + $dp->save(); + } + + $doc->cache_invalidate("products"); + + return []; + } + + public static function del_docproduct($doc, $prod) { + $dp = DocProduct::find([["document", "=", $doc], ["product", "=", $prod]])->first(); + if ($dp) { + $dp->delete(); + } + return back(); + } + + public static function get_by_id($id) { + return Document::find([["internal_id", "=", trim($id)]])->first(); + } + + public static function api_merge($id) { + $from = new Document($id); + $to = new Document($_POST['to']); + + if ($from->id == $to->id) return []; + + if ($from && $to) { + $revs = Revision::find([["document", "=", $from->id]]); + for ($rev = $revs->first(); $rev = $revs->next(); ) { + $rev->document = $to->id; + $rev->save(); + } + + $from->delete(); + } + return new Document($to->id); // Force refresh + } + + + + public static function api_drag_drop($_request) { + $src_id = $_request->post("src_id"); + $dst_id = $_request->post("dst_id"); + + $src_type = $_request->post("src_type"); + $dst_type = $_request->post("dst_type"); + + $src_extra = $_request->post("src_extra"); + $dst_extra = $_request->post("dst_extra"); + + $copy = $_request->post("copy") == "true"; + + if (($src_type == "document") && ($dst_type == "document")) { + // Merge src into dst + $src = new Document($src_id); + $dst = new Document($dst_id); + + if ($src->id == $dst->id) return []; + + foreach ($src->revisions as $r) { + $r->document = $dst->id; + $r->save(); + } + + $src->delete(); + $dst->cache_invalidate("revisions"); + } + + if (($src_type == "document") && ($dst_type == "product")) { + + if ($copy) { + $dp = new DocProduct(); + $dp->document = $src_id; + $dp->product = $dst_id; + $dp->save(); + } else { + + // Move document into product + $dpl = DocProduct::find([["document", "=", $src_id], ["product", "=", $src_extra]])->all(); + foreach ($dpl as $dp) { + $dp->product = $dst_id; + $dp->save(); + } + $prod = new Product($src_extra); + $prod->cache_invalidate("documents"); + } + $doc = new Document($src_id); + $doc->cache_invalidate("products"); + $prod = new Product($dst_id); + $prod->cache_invalidate("documents"); + } + + if (($src_type == "product") && ($dst_type == "product")) { + + if ($src_id == $dst_id) return []; + // Move product into product + $sp = new Product($src_id); + $dp = new Product($dst_id); + $sp->parent = $dp->id; + $sp->save(); + $sp->cache_invalidate("parent"); + $sp->cache_invalidate("children"); + $dp->cache_invalidate("parent"); + $dp->cache_invalidate("children"); + } + + + return [200, ["didit" => "true"]]; + } + + public static function merge($id) { + + $doc = new Document($id); + + $proc = new Process("pdftk"); + + foreach ($doc->revisions as $rev) { + $proc->arg($rev->path() . "/doc.pdf"); + } + + $nr = new Revision; + $nr->document = $doc->id; + $nr->revno = "NEW"; + $nr->save(); + + + $out = new File($nr->path() . "/doc.pdf"); + $out->parent()->mkdir(); + + $proc->arg("output"); + $proc->arg((string)$out); + $r = $proc->execute(); + + if ($r != 0) { + print("
");
+			print_r($proc->stderr());
+			print("
"); + exit(0); + } + + return redirect("/document/" . $doc->id); + } + + public static function create_overview($id, $move) { + + $job = new GeminiJob($id, "document:$id"); + $job->move = ($move == "move"); + $jobid = $job->queue(); + flash("success", "Job queued as ID " . $jobid); + + return redirect("/document/" . $id); + } + + public static function api_get_title_fragment($_request) { + $q = $_request->post("title"); + $db = DB::getInstance(); + $q1 = $db->query(" + SELECT + DISTINCT title + FROM ( + SELECT + DISTINCT title + FROM + document + WHERE + title LIKE :s + UNION SELECT + DISTINCT subtitle AS title + FROM + document + WHERE + subtitle LIKE :s + UNION SELECT + DISTINCT subsubtitle AS title + FROM + document + WHERE subsubtitle LIKE :s + ) AS DERIVED", ["s" => $q . "%"]); + $o = $db->all($q1); + + if ($o->count() == 0) { + return [404, "Not Found"]; + } + if ($o->count() != 1) { + return [413, "Content Too Large"]; + } + return $o[0]->title; + } + + public static function separate($id) { + + $doc = new Document($id); + $firstprod = $doc->products[0]; + + $count = 0; + + foreach ($doc->revisions as $rev) { + $count++; + if ($count == 1) { + continue; + } + + $newdoc = $doc->duplicate(); + $newdoc->subsubtitle .= " - $count"; + $rev->document = $newdoc->id; + $rev->save(); + } + + + return redirect("/documents/" . $firstprod); + } + + public static function api_get_metadata($id) { + return DocMeta::find([["document", "=", $id]])->orderBy("metadata")->all(); + } + + public static function api_new_metadata($_request, $id) { + $doc = new Document($id); + $doc->set_metadata($_request->put("item_id"), ""); + return DocMeta::find([["document", "=", $id]])->orderBy("metadata")->all(); + } + + public static function api_set_metadata($_request, $id, $metadata) { + $doc = new Document($id); + $doc->set_metadata($metadata, $_request->post('data')); + return DocMeta::find([["document", "=", $id]])->orderBy("metadata")->all(); + } + + public static function api_delete_metadata($id, $metadata) { + $doc = new Document($id); + $doc->remove_metadata($metadata); + return DocMeta::find([["document", "=", $id]])->orderBy("metadata")->all(); + } + + public static function api_available_metadata($id) { + $exist = DocMeta::find([["document", "=", $id]])->orderBy("metadata")->all(); + $metas = MetaType::find()->all(); + + + $out = new Collection(); + + foreach ($metas as $meta) { + $e = false; + foreach ($exist as $ex) { + if ($ex->metadata == $meta->id) { + $e = true; + break; + } + } + + if (!$e) { + $cl = new stdClass; + $cl->key = $meta->id; + $cl->value = $meta->name; + $out->push($cl); + } + } + + $out->sort("value"); + + return $out; + } + + public static function delete_metadata($id, $metadata) { + $doc = new Document($id); + $doc->remove_metadata($metadata); + return redirect("/document/" . $id); + } + + public static function api_guess_docid($id) { + $doc = new Document($id); + $docid = $doc->guess_docid(); + + return new Collection(["id" => $id, "docid" => $docid]); + } + + public static function download_attachment($id, $filename) { + $doc = new Document($id); + $atts = $doc->get_attachments(); + foreach ($atts as $f) { + if ($f->basename() == $filename) { + $f->set_header("Content-Disposition", "attachment; filename=\"$filename\""); + + return $f; + } + } + return false; + } + + public static function upload_attachment($id) { + $doc = new Document($id); + return blade("upload.attachment", ["doc" => $doc]); + } + + public static function do_upload_attachment($_request, $id) { + $doc = new Document($id); + mkdir(ROOT . "/attachments/" . $doc->id, 0777); + + $f = 0; + while (($file = $_request->file("file", $f)) !== false) { + $nf = new File($file['tmp_name']); + $nf->rename(ROOT . "/attachments/" . $doc->id . "/" . $file['name']); + $f++; + } + return redirect("/document/" . $doc->id); + } + + public static function upload_document($_request) { + return blade("upload.document"); + } + + public static function do_upload_document($_request) { + $i = 0; + while ($f = $_request->file("file", $i)) { + + $file = new File($f['tmp_name']); + $sha256 = $file->hash(); + + $rev = Revision::find([["sha256", "=", $sha256]])->first(); + + if ($rev) { + return redirect("/uploads/duplicate/" . $rev->id); + } + + $u = new Upload(); + $u->filename = $f['name']; + $u->sha256 = $sha256; + $u->ocr = "N"; + $u->ai = "N"; + $u->owner = get_user()->id; + $u->save(); + copy($f['tmp_name'], ROOT . "/uploads/" . $u->id . ".pdf"); + $j = new ImportGeminiJob($u->id); + $j->queue(); + $j = new ImportOCRJob($u->id); + $j->queue(); + $i++; + } + return redirect("/uploads"); + } + + public static function rerun_upload($id) { + $u = new Upload($id); + if ($u->ocr == "F") { + $u->ocr = "N"; + $u->save(); + $j = new ImportOCRJob($u->id); + $j->queue(); + } + + if ($u->ai == "F") { + $u->ai = "N"; + $u->save(); + $j = new ImportGeminiJob($u->id); + $j->queue(); + } + return redirect("/uploads"); + } + + public static function rerun_all() { + $ai = Upload::find([["ai", "=", "F"], ["owner", "=", get_user()->id]])->all(); + foreach ($ai as $u) { + $u->ai = "N"; + $u->save(); + $j = new ImportGeminiJob($u->id); + $j->queue(); + } + $ocr = Upload::find([["ocr", "=", "F"], ["owner", "=", get_user()->id]])->all(); + foreach ($ocr as $u) { + $u->ocr = "N"; + $u->save(); + $j = new ImportOCRJob($u->id); + $j->queue(); + } + return redirect("/uploads"); + } + + public static function uploads($_request) { + return DocumentController::uploads_page($_request, 0); + } + + public static function uploads_page($_request, $page) { + $uploads = Upload::find([["owner", "=", get_user()->id]])->orderBy("id")->limit($page * 20, 20)->all(); + return blade("upload.list", ["uploads" => $uploads, "page" => $page]); + } + + public static function discard_upload($_request, $id) { + $u = new Upload($id); + if ($u->owner != get_user()->id) { + return [403, "Not yours, punk!"]; + } + + DB::getInstance()->query("delete from job where source=:source", ["source" => "upload:" . $u->id]); + + unlink($u->getPDF()); + $u->delete(); + return redirect("/uploads"); + } + + public static function import($_request, $id, $source) { + $u = new Upload($id); + if ($u->owner != get_user()->id) { + return [403, "Not yours, punk!"]; + } + + $doc = false; + + if ($source == "ai") { + $doc = Document::find_by_docid($u->ai_docid); + } else if ($source == "ocr") { + $doc = Document::find_by_docid($u->ocr_docid); + } + + if (!$doc) { + $doc = new Document; + if ($source == "ai") { + $doc->internal_id = $u->ai_docid; + } else if ($source == "ocr") { + $doc->internal_id = $u->ocr_docid; + } else { + $doc->internal_id = "XX-XXXXX-XX"; + } + $doc->title = $u->title; + $doc->subtitle = $u->subtitle; + $doc->subsubtitle = $u->subsubtitle; + $doc->overview = $u->overview; + $doc->save(); + + $incoming = Product::find([["title", "=", "Incoming"]])->first(); + $dp = new DocProduct(); + $dp->document = $doc->id; + $dp->product = $incoming->id; + $dp->save(); + } + + + $rev = new Revision(); + $rev->document = $doc->id; + $rev->revid=""; + $rev->sha256 = $u->sha256; + $rev->origtitle = $u->source; + $rev->save(); + + + $ocr = new OCR(); + $ocr->revision = $rev->id; + $ocr->body = $u->body; + $ocr->save(); + + $out = new File($rev->path() . "/doc.pdf"); + $out->parent()->mkdir(); + + $pdf = $u->getPDF(); + $pdf->rename($out->path()); + + $db = DB::getInstance(); + $db->query("DELETE FROM job WHERE source=:source", ["source" => "upload:" . $u->id]); + $u->delete(); + + $rev->info = $rev->getPDF()->info(); + $rev->save(); + + $j = new IndexJob($rev->id); + $j->queue(); + + + //return redirect("/uploads"); + return redirect("/document/" . $doc->id); + + } + + public static function delete_upload($_request, $id) { + $u = new Upload($id); + if ($u->owner != get_user()->id) { + return [403, "Not yours, punk!"]; + } + } + + public static function upload_duplicate($id) { + $r = new Revision($id); + return blade("upload.duplicate", ["rev" => $r]); + } + + public static function view_upload($id) { + $u = new Upload($id); + return $u->getPDF(); + } +} diff --git a/app/controllers/DownloadController.php b/app/controllers/DownloadController.php new file mode 100644 index 0000000..bcd4cde --- /dev/null +++ b/app/controllers/DownloadController.php @@ -0,0 +1,31 @@ +id]])->orderBy("queued")->limit(20); + return $s->all(); + } + + public static function api_add_download($_request) { + $url = $_request->put("url"); + $d = new DownloadJob; + $d->url = $url; + $d->queued = time(); + $d->started = 0; + $d->finished = 0; + $d->processed = 0; + $d->owner = get_user()->id; + $d->file = sprintf("download/file-%08X-%08X", rand(), time()); + + $d->save(); + return DownloadController::api_downloads(); + } + +} diff --git a/app/controllers/FavouriteController.php b/app/controllers/FavouriteController.php new file mode 100644 index 0000000..013b879 --- /dev/null +++ b/app/controllers/FavouriteController.php @@ -0,0 +1,33 @@ +set_favourite($doc); + } + return redirect("/document/" . $doc); + } + + public static function user_unset_favourite($doc) { + $user = get_user(); + if ($user) { + $user->unset_favourite($doc); + } + return redirect("/document/" . $doc); + } + + public static function favourites() { + $user = get_user(); + if (!$user) return [403, "Huh... yeah right"]; + $f = $user->favourites(); + $docs = new Collection; + foreach ($f as $fav) { + $doc = new Document($fav->document); + $docs->add($doc); + } + return blade("/favourites", ["docs" => $docs]); + } + +} diff --git a/app/controllers/HomeController.php b/app/controllers/HomeController.php new file mode 100644 index 0000000..98ff380 --- /dev/null +++ b/app/controllers/HomeController.php @@ -0,0 +1,7 @@ +orderBy("queued")->limit(50)->all(); + foreach ($is as $i) { + $i->load("revision"); + } + return $is; + } + + public static function api_delete_import($id) { + $d = new ProcessJob($id); + if ($d->valid()) { + $d->delete(); + } + return ImportController::api_imports(); + } + + public static function api_set_import($_request, $id) { + $d = new ProcessJob($id); + if ($d->valid()) { + foreach ($_POST as $k=>$v) { + $d->$k = $v; + } + $d->save(); + } + return ImportController::api_imports(); + } + + public static function api_add_document($_request, $id) { + + $job = new ProcessJob($id); + + $doc = Document::find([["internal_id", "=", $_request->put('internal_id')]])->first(); + if (!$doc) { + $doc = new Document; + $doc->internal_id = trim($_request->put('internal_id')); + $doc->title = trim($_request->put('title')); + $doc->subtitle = trim($_request->put('subtitle')); + $doc->subsubtitle = trim($_request->put('subsubtitle')); + $doc->overview = trim($_request->put('overview')); + $doc->owner = get_user()->id; + $doc->save(); + + $prods = explode(",", $_request->put('products')); + foreach ($prods as $product) { + $dp = new DocProduct; + $dp->document = $doc->id; + $dp->product = $product; + $dp->save(); + } + } + + $job->document = $doc->id; + + $rev = new Revision($job->revision); + $rev->document = $doc->id; + $rev->revno = trim($_request->put('revno')); + $rev->month = $_request->put('month'); + $rev->year = $_request->put('year'); + $rev->owner = get_user()->id; + $rev->save(); + + $job->imported = time(); + $job->save(); + + return ImportController::api_imports(); + } +} diff --git a/app/controllers/JobController.php b/app/controllers/JobController.php new file mode 100644 index 0000000..47e08f1 --- /dev/null +++ b/app/controllers/JobController.php @@ -0,0 +1,23 @@ +query("select * from job where source=:source order by queued", ["source" => $source]); + + $c = new Collection(); + + while ($r = $db->nextRecord($q)) { + $c->push($r); + } + return $c; + } + + public static function api_delete_job($id) { + $db = DB::getInstance(); + $q = $db->query("select * from job where id=:id", ["id" => $id]); + $r = $db->nextRecord($q); + $q = $db->query("delete from job where id=:id", ["id" => $id]); + return JobController::api_get_jobs($r->source); + } +} diff --git a/app/controllers/PDFController.php b/app/controllers/PDFController.php new file mode 100644 index 0000000..6d64788 --- /dev/null +++ b/app/controllers/PDFController.php @@ -0,0 +1,57 @@ +path(); + + $rev->downloads++; + $rev->last_download = time(); + $rev->save(); + + $disp = "attachment"; + $mime = "application/octet-stream"; + + $file = null; + + switch ($type) { + case "view": + $file = new PDF($path . "/doc.pdf"); + break; + case "download": + $file = new PDF($path . "/doc.pdf"); + $file->force_download(); + break; + case "viewocr": + $file = new PDF($path . "/ocr.pdf"); + break; + case "downloadocr": + $file = new PDF($path . "/ocr.pdf"); + $file->force_download(); + break; + } + $file->fake_filename($filename); + + if ($file == null) { + return [404, "Not Found 1"]; + } + + if (!$file->exists()) { + return [404, "Not Found 2"]; + } + + $file->set_header("link", "<" . Config::get("URL") . "/pdf/" . $id . "/download/" . $filename . '>; rel="canonical"'); + + return $file; + } + + public static function get_page($id, $page) { + $rev = new Revision($id); + $page = $rev->get_page($page, 150); + if ($page) { + return $page; + } + return [404, "Not Found"]; + } +} diff --git a/app/controllers/ProductController.php b/app/controllers/ProductController.php new file mode 100644 index 0000000..a04a8ce --- /dev/null +++ b/app/controllers/ProductController.php @@ -0,0 +1,164 @@ +query("select * from product where id=:id", ["id" => $pid]); + if ($r = $db->nextRecord($q)) { + $out->push($r); + } + } + return $out; + } + + public static function api_get_mru() { + $out = new Collection; + $mru = Session::get("mru"); + if (!$mru) { + $mru = []; + } + foreach ($mru as $p) { + $prod = new Product($p); + if ($prod) { + $out->push($prod); + } + } + return $out; + } + + public static function api_add_mru($id) { + $mru = Session::get("mru"); + if (!$mru) { + $mru = []; + } + array_unshift($mru, $id); + $mru = array_unique($mru); + while (count($mru) > 5) { + array_pop($mru); + } + Session::set("mru", $mru); + return ProductController::api_get_mru(); + } + + public static function api_search() { + + return Product::find([["full_path", "like", "%" . $_POST['search'] . "%"]])->orderBy("full_path")->all(); + } + + public static function api_add_child($_request, $id) { + $p = new Product; + $p->parent = $id; + $p->title = $_request->put("title"); + $p->save(); + return $p; + } + + public static function api_set($id) { + $p = new Product($id); + + $data = []; + foreach ($_POST as $k=>$v) { + $p->$k = $v; + } + $p->save(); + + return $p; + } + + public static function api_move($id) { + $p = new Product($id); + $p->parent = $_POST['to']; + $p->save(); + return $p; + } + + public static function api_delete($id) { + $product = new Product($id); + if ($product->valid()) { + $laf = Product::find([["title", "=", "Lost and Found"]])->first(); + + DB::getInstance()->query("delete from docproduct where product=:pid", ["pid" => $product->id]); + + foreach ($product->children as $c) { + $c->parent = $laf; + $c->save(); + } + $product->load("parent"); + $par = $product->parent; + $product->delete(); + return $par; + } + return []; + } + + public static function api_empty_trash($id) { + $prod = new Product($id); + $docs = $prod->documents; + + foreach ($docs as $doc) { + $revs = $doc->revisions; + foreach ($revs as $rev) { + $rev->delete(); + } + + $dpl = DocProduct::find([["document", "=", $doc->id]])->all(); + foreach ($dpl as $dp) { + $dp->delete(); + } + + $doc->delete(); + } + + $prod->invalidate("documents"); + + + return []; + + } + + public static function api_available_metadata($id) { + $prod = new Product($id); + $exist = $prod->meta(); + $metas = MetaType::find()->all(); + + $out = new Collection(); + + foreach ($metas as $meta) { + if (!in_array($meta->id, $exist)) { + $cl = new stdClass; + $cl->key = $meta->id; + $cl->value = $meta->name; + $out->push($cl); + } + } + + $out->sort("value"); + + return $out; + } + + public static function api_add_metadata($_request, $id) { + $prod = new Product($id); + $prod->add_meta($_request->put('item_id')); + return Collection::from_array($prod->meta()); + } + + public static function api_gemini_all($id, $move) { + $prod = new Product($id); + + $c = new Collection(); + + foreach ($prod->documents as $doc) { + if ($prod->oneliner == "") { + $job = new GeminiJob($doc->id, "document:" . $doc->id); + $job->move = ($move == "move"); + $jobid = $job->queue(); + $c->push(["document" => $doc->id, "job" => $jobid]); + } + } + return $c; + } +} diff --git a/app/controllers/RevisionController.php b/app/controllers/RevisionController.php new file mode 100644 index 0000000..a7fc02f --- /dev/null +++ b/app/controllers/RevisionController.php @@ -0,0 +1,107 @@ +load("document"); + + + if (!@$rev->info->Pages) { + $rev->info = $rev->getPDF()->info(); + $rev->save(); + } + + return blade("revision", ["rev" => $rev]); + } + + public static function api_set($id) { + $r = new Revision($id); + if ($r !== false) { + foreach ($_POST as $k=>$v) { + $r->$k = trim($v); + } + $r->save(); + } + + return $r; + } + + public static function delete($id) { + $r = new Revision($id); + $r->load("document"); + $doc = $r->document; + $r->delete(); + return redirect("/document/" . $doc->id); + } + + public static function redownload($id) { + $r = new Revision($id); + $j = new RedownloadJob($r->id, $r->origtitle, $r->path() . "/doc.pdf"); + $jobid = $j->queue(); + flash("success", "Job queued as ID " . $jobid); + return redirect("/revision/" . $id); + } + + public static function purge($id) { + $r = new Revision($id); + $r->purge(); + return redirect("/revision/" . $id); + } + + public static function recompress($id) { + $r = new Revision($id); + $j = new RecompressJob($r->id); + $j->queue(); + flash("info", "Recompression job queued"); + return redirect("/revision/" . $id); + } + + public static function ocr($id) { + $j = new OCRJob($id); + $j->queue(); + return redirect("/revision/" . $id); + } + + public static function rate_revision($id, $rating) { + $user = get_user(); + if (!$user) { + return new Revision($id); + } + $db = DB::getInstance(); + $db->query("INSERT INTO revision_rating (owner,revision,rating) values (:owner,:revision,:rating) ON DUPLICATE KEY UPDATE rating=:rating", [ + "owner" => $user->id, + "revision" => $id, + "rating" => $rating + ]); + $db->query("UPDATE revision SET rating=(SELECT AVG(rating) FROM revision_rating WHERE revision=:revision) WHERE id=:revision", ["revision" => $id]); + + return new Revision($id); + + } + + public static function split_revision($id) { + $r = new Revision($id); + $r->load("document"); + $doc = new Document(); + $doc->title = $r->document->title; + $doc->subtitle = $r->document->subtitle; + $doc->subsubtitle = $r->document->subsubtitle; + $doc->overview = $r->document->overview; + $doc->oneliner = $r->document->oneliner; + $doc->internal_id = $r->document->internal_id; + $doc->save(); + foreach ($r->document->products as $prod) { + $dp = new DocProduct(); + $dp->document = $doc->id; + $dp->product = $prod->id; + $dp->save(); + } + $r->document = $doc->id; + $r->save(); + + return redirect("/document/" . $doc->id); + } + +} diff --git a/app/controllers/SearchController.php b/app/controllers/SearchController.php new file mode 100644 index 0000000..1d037a6 --- /dev/null +++ b/app/controllers/SearchController.php @@ -0,0 +1,76 @@ +query(" + select + id, internal_id, title, subtitle, subsubtitle, + match (internal_id, title, subtitle, subsubtitle, overview) + against (:search in boolean mode) + as rel + from + document + where + match (internal_id, title, subtitle, subsubtitle, overview) + against (:search in boolean mode) + order by + rel desc + limit + 10 + ", ["search" => $_POST['search']]); + while ($r = DB::getInstance()->nextRecord($q)) { + $o = new Document($r->id); + $out->push($o); + } + return $out; + } + + static public function search($page = 0) { + if (array_key_exists("search", $_POST)) { + $q = DB::getInstance()->query(" + select + revision.id as id, + match(ocr.body) against (:search) as relevance + from + revision,ocr + where + match(ocr.body) against (:search) and + ocr.revision = revision.id and + not revision.document is null + order by + relevance desc + + ", ["search" => $_POST['search']]); + + $slog = []; + + while ($r = DB::getInstance()->nextRecord($q)) { + $slog[] = $r->id; + } + + Session::set("search", json_encode($slog)); + } + + $rpp = 8; + + $offset = $page * $rpp; + + $out = []; + + $slog = json_decode(Session::get("search")); + + for ($i = 0; $i < $rpp; $i++) { + if ($offset + $i < count($slog)) { + $rev = new Revision($slog[$offset + $i]); + if ($rev) { + $out[] = $rev; + } + } + } + + return blade("search", ["page" => $page, "count" => count($slog), "results" => $out, "pages" => ceil(count($slog) / $rpp)]); + } +} + diff --git a/app/controllers/SitemapController.php b/app/controllers/SitemapController.php new file mode 100644 index 0000000..20a18f4 --- /dev/null +++ b/app/controllers/SitemapController.php @@ -0,0 +1,9 @@ +all(); + $revs = Revision::find()->all(); + return blade("sitemap", ["docs" => $docs, "revs" => $revs]); + } +} diff --git a/app/controllers/SpiderController.php b/app/controllers/SpiderController.php new file mode 100644 index 0000000..56d50b6 --- /dev/null +++ b/app/controllers/SpiderController.php @@ -0,0 +1,83 @@ +orderBy("id")->limit(20)->all(); + + return $pdfs; + } + + public static function api_pages() { + $pages = SpiderPage::find([["status", "=", "O"], ["title", "!=", ""]])->orderBy("title")->limit(20)->all(); + + return $pages; + } + + public static function api_reject_pdf($id = null) { + if ($id == null) return []; + + $i = explode(",", $id); + foreach ($i as $id) { + $pdf = new Spider($id); + if ($pdf) { + $pdf->status = "B"; + $pdf->save(); + } + } + return SpiderController::api_pdfs(); + } + + public static function api_accept_pdf($_request, $id = null) { + if ($id == null) return []; + + $i = explode(",", $id); + foreach ($i as $id) { + $pdf = new Spider($id); + if ($pdf) { + $pdf->status = "D"; + $pdf->save(); + + $job = new DownloadJob($pdf->url); + $job->queue(get_user()->id); + } + } + return SpiderController::api_pdfs(); + } + + public static function api_reject_page($_request, $id) { + $i = explode(",", $id); + foreach ($i as $id) { + $page = new SpiderPage($id); + if ($page) { + $page->status = "B"; + $page->save(); + } + } + return SpiderController::api_pages(); + } + + public static function api_accept_page($id) { + + $i = explode(",", $id); + foreach ($i as $id) { + $page = new SpiderPage($id); + if ($page) { + $page->status = "N"; + $page->save(); + } + } + return SpiderController::api_pages(); + } +} + + + diff --git a/app/controllers/SystemController.php b/app/controllers/SystemController.php new file mode 100644 index 0000000..1f80bb9 --- /dev/null +++ b/app/controllers/SystemController.php @@ -0,0 +1,140 @@ + "Blacklisted", + "N" => "Pending", + "F" => "Failed", + "D" => "Done", + "Y" => "Done", + "W" => "Postponed", + "P" => "Processing", + "X" => "Deleted", + "O" => "Off-site", + "Q" => "Postponed", + "R" => "Redirect", + ]; + + $q = DB::getInstance()->query("select count(id) as c, status from pages group by status order by status"); + $spider = []; + while ($r = DB::getInstance()->nextRecord($q)) { + $spider[@$status[$r->status]] = $r->c; + } + + $q = DB::getInstance()->query("select count(id) as c, status from spider group by status order by status"); + $pdf = []; + while ($r = DB::getInstance()->nextRecord($q)) { + $pdf[@$status[$r->status]] = $r->c; + } + + $q = DB::getInstance()->query("select count(id) as c, ocr from revision group by ocr order by ocr"); + $ocr = []; + while ($r = DB::getInstance()->nextRecord($q)) { + $ocr[@$status[$r->ocr]] = $r->c; + } + + $q = DB::getInstance()->query("select count(id) as c, idx from revision group by idx order by idx"); + $idx = []; + while ($r = DB::getInstance()->nextRecord($q)) { + $idx[@$status[$r->idx]] = $r->c; + } + + return blade("status", ["spider" => $spider, "pdf" => $pdf, "ocr" => $ocr, "idx" => $idx]); + } + + + public static function api_get_idmatches() { + return IDMatch::find([["id", ">=", 0]])->orderBy("weight")->all(); + } + + public static function api_add_idmatch($_request) { + $i = new IDMatch; + $i->example = $_request->put('example'); + $i->regex = $_request->put('regex'); + $i->weight = $_request->put('weight'); + $i->save(); + return SystemController::api_get_idmatches(); + } + + public static function api_set_idmatch($id) { + $i = new IDMatch($id); + if ($i) { + $i->example = $_POST['example']; + $i->regex = $_POST['regex']; + $i->weight = $_POST['weight']; + $i->save(); + } + return SystemController::api_get_idmatches(); + } + + public static function api_del_idmatch($id) { + $i = new IDMatch($id); + if ($i) { + $i->delete(); + } + return SystemController::api_get_idmatches(); + } + + + + public static function systems() { + $u = get_user(); + $sys = System::find([["owner", "=", $u->id]])->all(); + return blade("systems", ["systems" => $sys]); + } + + public static function system($id) { + $sys = new System($id); + $sys->load("documents"); + return blade("system", ["sys" => $sys]); + } + + public static function systems_add() { + return blade("systems_add"); + } + + public static function systems_do_add($_request) { + $sys = new System; + $sys->name = $_request->post("name"); + $sys->model = $_request->post("model"); + $sys->notes = $_request->post("notes"); + $sys->owner = get_user()->id; + $sys->save(); + return redirect("/system/" . $sys->id); + } + + public static function system_add_doc($id, $doc) { + $sys = new System($id); + if ($sys->owner == get_user()->id) { + $exist = SystemDoc::find([ + ["system", "=", $sys->id], + ["document", "=", $doc] + ])->first(); + if (!$exist) { + $sd = new SystemDoc; + $sd->system = $sys->id; + $sd->document = $doc; + $sd->save(); + } + return redirect("/system/" . $id); + } + return [403, "Forbidden"]; + } + + public static function system_del_doc($id, $doc) { + $sys = new System($id); + if ($sys->owner == get_user()->id) { + $sd = SystemDoc::find([ + ["system", "=", $sys->id], + ["document", "=", $doc] + ])->first(); + if ($sd) { + $sd->delete(); + } + return redirect("/system/" . $id); + } + return [403, "Forbidden"]; + } +} + diff --git a/app/jobs/DownloadJob.php b/app/jobs/DownloadJob.php new file mode 100644 index 0000000..89a38f0 --- /dev/null +++ b/app/jobs/DownloadJob.php @@ -0,0 +1,87 @@ +from = $from; + parent::__construct("download"); + } + + public function generate_to() { + $filename = ROOT . "/download/file-" . time() . "-" . rand() . ".pdf"; + return $filename; + } + + public function run() { + + + $this->to = $this->generate_to(); + $ch = curl_init(); + $this->status("Downloading: 0%"); + $fd = fopen($this->to, "w"); + + curl_setopt($ch, CURLOPT_URL, $this->from); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); + curl_setopt($ch, CURLOPT_PRIVATE, $this); + curl_setopt($ch, CURLOPT_TIMEOUT, 3600); + curl_setopt($ch, CURLOPT_FILETIME, true); + curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, [$this, 'download_progress']); + curl_setopt($ch, CURLOPT_NOPROGRESS, false); + curl_setopt($ch, CURLOPT_FILE, $fd); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + + print("Running...\n"); + $r = curl_exec($ch); + fclose($fd); + + $file = new File($this->to); + $sha256 = $file->hash(); + + $rev = Revision::find([["sha256", "=", $sha256]])->first(); + + if ($rev) { + $this->status("Duplicate file"); + $this->fail(); + print("Finished (duplicate)\n"); + return; + } + + $u = new Upload(); + $u->filename = basename($this->from); + $u->sha256 = $sha256; + $u->source = $this->from; + $u->ocr = "N"; + $u->ai = "N"; + $u->owner = $this->getOwner(); + $u->save(); + $file->rename(ROOT . "/uploads/" . $u->id . ".pdf"); + $j = new ImportGeminiJob($u->id); + $j->queue($u->owner); + $j = new ImportOCRJob($u->id); + $j->queue($u->owner); + + $this->status("Finished"); + print("Finished\n"); + $this->finish(); + } + + + + function download_progress($ch, $download_size, $downloaded, $upload_size, $uploaded) { + if ($download_size == 0) return; + $pct = round($downloaded / $download_size * 100); + if ($pct != $this->_pct) { + $this->status("Downloading: " . $pct . "%"); + $this->_pct = $pct; + } + } +} diff --git a/app/jobs/GeminiJob.php b/app/jobs/GeminiJob.php new file mode 100644 index 0000000..f1d1738 --- /dev/null +++ b/app/jobs/GeminiJob.php @@ -0,0 +1,211 @@ +docid = $docid; + } + + public function run() { + + $pdf = false; + + $subs = [ + "Installation and Operating Information", + "Installation and Configuration", + "Installing and Getting Started", + "Installation/Operator's Manual", + "Installation/Operator's Guide", + "Programmer's Reference Guide", + "Field Maintenance Print Set", + "Illustrated Parts Breakdown", + "Installation/Owner's Guide", + "Installation Information", + "Installation/User Guide", + "User Documentation Kit", + "Programmer Information", + "Technical Description", + "Operator Information", + "Configuration Guide", + "Upgrade Information", + "Installation Manual", + "Service Information", + "Installation Guide", + "Programming Manual", + "Maintenance Manual", + "Maintenance Guide", + "Technical Summary", + "Operator's Guide", + "System Reference", + "User Information", + "Technical Manual", + "Language Manual", + "Service Manual", + "Service Guide", + "Read Me First", + "Owner's Guide", + "Release Notes", + "Options Guide", + "Users' Manual", + "User's Manual", + "HiTest Notes", + "User's Guide", + "Design Guide", + "User Manual", + "User Guide", + + ]; + + $doc = new Document($this->docid); + + $minsize = 999999999999999; + + foreach ($doc->revisions as $r) { + $p = new PDF($r->path() . "/doc.pdf"); + if ($p->size() < $minsize) { + $minsize = $p->size(); + $rev = $r; + $pdf = $p; + } + } + + if (!$pdf) { + $this->fail("No files to upload"); + return; + } + + $prods = []; + $db = DB::getInstance(); + $q = $db->query("select id, full_path from product"); + while ($r = $db->nextRecord($q)) { + $prods[] = $r->id . "," . $r->full_path; + } + + if ($doc->is_incoming()) { + $this->move = true; + } + + file_put_contents("/tmp/category-list.csv", implode("\n", $prods) . "\n"); + + $this->status("Processing document with Gemini"); + try { + $gemini = new Gemini(); +// $gemini->verbose = true; + + $p = new GeminiParameter("title", "object", "The title of the document (note: none of these parts should include the order number)", true); + $p->add_child("main_title", "string", "The primary portion of the title, properly recapitalized to fit English grammar", true); + $p->add_child("subtitle", "string", "Any portion of the title that could be used as a subtitle, such as 'user guide' or 'maintenance guide' etc. Remove this from the main title. Should not be the order number."); + $p->add_child("subsubtitle", "string", "Any part of the title that could be extra information such as version number or language. Should not be the order number."); + $gemini->add_parameter($p); + + $p = new GeminiParameter("category", "integer", "The category the document best fits in from the provided list of categories in the file category-list.csv", true); + $gemini->add_parameter($p); + + $gemini->add_parameter(new GeminiParameter("order_number", "string", "The document order number, often in the format XX-YYYYY-ZZ where YYYYY is based on the product code and ZZ is the type of document. Never more than 15 characters long.")); + $gemini->add_parameter(new GeminiParameter("overview", "string", "A brief one-line overview of the document content in plain text format", true)); + $gemini->add_parameter(new GeminiParameter("summary", "string", "A longer summary of the document content in markdown format", true)); + $gemini->upload_callback([$this, "uploadcb"]); + $gemini->process_callback([$this, "processcb"]); + + $gemini->attach($pdf->basename(), $pdf); + $gemini->attach("category-list.csv", new File("/tmp/category-list.csv")); + + $lines = $gemini->geminiOverview(); + } catch (Exception $e) { + $this->status($e->getMessage()); + if ($e->getMessage() == "The request timed out. Please try again.") { + $this->retry("timeout"); + } else if ($e->getMessage() == "HTTP Error 0 requesting AI assistance") { + $this->retry("error 0"); + } else if (str_starts_with($e->getMessage(), "You exceeded your current quota, please check your plan and billing details.")) { + $this->retries++; + if ($this->retries < 5) { + $this->retry("quota exceeded"); + } else { + $this->fail("Too many retries"); + } + } else if ($e->getMessage() == "This model is currently experiencing high demand. Spikes in demand are usually temporary. Please try again later.") { + $this->retry("overload"); + } else { + $this->fail(); + } + return; + } + + $data = json_decode($lines, true); + + if (!$data) { + $this->fail("No response from AI"); + return; + } + + // Reload document since this took a while + $doc = new Document($this->docid); + + if (array_key_exists("title", $data)) { + $doc->subtitle = ""; + $doc->subsubtitle = ""; + if (array_key_exists("main_title", $data["title"])) { $doc->title = $data['title']['main_title']; } + if (array_key_exists("subtitle", $data["title"])) { $doc->subtitle = $data['title']['subtitle']; } + if (array_key_exists("subsubtitle", $data["title"])) { $doc->subsubtitle = $data['title']['subsubtitle']; } + if ($doc->subtitle != "") { + $doc->title = str_replace(" " . $doc->subtitle, "", $doc->title); + } + } + if (array_key_exists("order_number", $data)) { $doc->internal_id = substr($data['order_number'], 0, 20); } + if (array_key_exists("summary", $data)) { $doc->overview = $data['summary']; } + if (array_key_exists("overview", $data)) { $doc->oneliner = $data['overview']; } + + + + $doc->save(); + + if (array_key_exists("category", $data)) { + $cat = $data['category']; + $q = $db->query("select * from product where id=:id", ["id" => $cat]); + if ($r = $db->nextRecord($q)) { + if ($this->move) { + $q = $db->query("delete from docproduct where document=:id", ["id" => $doc->id]); + } + $edp = DocProduct::find([ + ["product", "=", $r->id], + ["document", "=", $doc->id] + ])->first(); + + if (!$edp) { + $dp = new DocProduct; + $dp->document = $doc->id; + $dp->product = $r->id; + $dp->save(); + } + } else { + print("--- Incorrect category suggested: " . $cat . "\n"); + } + } + + $this->status("Finished"); + $this->finish(); + return; + } + + + public function uploadcb($percent) { + $this->status("Uploading: " . $percent . "% complete"); + } + + public function processcb($message) { + $this->status($message); + } + + function cleanup($txt) { + $txt = str_replace("Ø", "0", $txt); + $txt = str_replace(".", " ", $txt); + return $txt; + } +} diff --git a/app/jobs/ImportGeminiJob.php b/app/jobs/ImportGeminiJob.php new file mode 100644 index 0000000..b92bceb --- /dev/null +++ b/app/jobs/ImportGeminiJob.php @@ -0,0 +1,182 @@ +upload_id = $upload_id; + } + + public function run() { + + Config::refresh(); + + $pdf = false; + + $subs = [ + "Installation and Operating Information", + "Installation and Configuration", + "Installing and Getting Started", + "Installation/Operator's Manual", + "Installation/Operator's Guide", + "Programmer's Reference Guide", + "Field Maintenance Print Set", + "Illustrated Parts Breakdown", + "Installation/Owner's Guide", + "Installation Information", + "Installation/User Guide", + "User Documentation Kit", + "Programmer Information", + "Technical Description", + "Operator Information", + "Configuration Guide", + "Upgrade Information", + "Installation Manual", + "Service Information", + "Installation Guide", + "Programming Manual", + "Maintenance Manual", + "Maintenance Guide", + "Technical Summary", + "Operator's Guide", + "System Reference", + "User Information", + "Technical Manual", + "Language Manual", + "Service Manual", + "Service Guide", + "Read Me First", + "Owner's Guide", + "Release Notes", + "Options Guide", + "Users' Manual", + "User's Manual", + "HiTest Notes", + "User's Guide", + "Design Guide", + "User Manual", + "User Guide", + + ]; + + $doc = new Upload($this->upload_id); + $doc->ai = "P"; + $doc->save(); + $pdf = $doc->getPDF(); + + if (!$pdf) { + $this->fail(); + $doc->ai = "F"; + $this->status("PDF File Missing"); + $doc->save(); + return; + } + + if ($pdf->size() > 50000000) { + $this->status("File too large"); + $doc->ai = "F"; + $doc->save(); + $this->fail(); + return; + } + + $this->status("Processing " . $doc->filename . " with Gemini"); + try { + $gemini = new Gemini(); + $gemini->upload_callback([$this, "uploadcb"]); + $gemini->process_callback([$this, "processcb"]); + $lines = $gemini->geminiOverview($pdf); + } catch (Exception $e) { + $mess = $e->getMessage(); + print($mess . "\n"); + + switch ($mess) { + case "This model is currently experiencing high demand. Spikes in demand are usually temporary. Please try again later.": + case "The request timed out. Please try again.": + case "HTTP Error 0 requesting AI assistance": + $this->retry(); + print("Retrying\n"); + break; + default: + $this->fail(); + $this->status(substr($mess, 0, 250)); + $doc->overview = $mess; + $doc->ai = "F"; + $doc->save(); + } + return; + } + + $this->status("Postprocessing returned data"); + $ld = explode("\n", $lines); + if (preg_match('/^\{(.*)\}$/', trim($ld[0]), $m)) { + $title = trim($m[1]); + + $title = str_replace("’", "'", $title); + + $newsub = ""; + $newsubsub = ""; + + + $b = explode(":", $title); + if (count($b) > 1) { + $title = trim(array_shift($b)); + $newsub = trim(array_shift($b)); + $newsubsub = implode(": ", $b); + } + + if ($newsub == "") { + foreach ($subs as $sub) { + if (str_ends_with($title, $sub)) { + $newsub = $sub; + $title = substr($title, 0, 0 - (strlen($sub) + 1)); + break; + } + } + } + $doc->title = $title; + $doc->subtitle = $newsub; + $doc->subsubtitle = $newsubsub; + + array_shift($ld); + if (trim($ld[0]) == "") { + array_shift($ld); + } + } + if (preg_match('/^\[(.*)\]$/', trim($ld[0]), $m)) { + + $iid = IDMatch::find_docid($this->cleanup($m[1])); + + if ($iid) { + $doc->ai_docid = $iid[0]; + } + array_shift($ld); + } + $doc->overview = implode("\n", $ld); + $doc->ai = "Y"; + + $doc->save(); + $this->status("Finished"); + $this->finish(); + return; + } + + + public function uploadcb($percent) { + $this->status("Uploading: " . $percent . "% complete"); + } + + public function processcb($message) { + $this->status($message); + } + + function cleanup($txt) { + $txt = str_replace("Ø", "0", $txt); + $txt = str_replace(".", " ", $txt); + return $txt; + } +} diff --git a/app/jobs/ImportOCRJob.php b/app/jobs/ImportOCRJob.php new file mode 100644 index 0000000..3e94e41 --- /dev/null +++ b/app/jobs/ImportOCRJob.php @@ -0,0 +1,67 @@ +upload_id = $upload_id; + } + + public function run() { + + $pdf = false; + + $doc = new Upload($this->upload_id); + $doc->ocr = "P"; + $doc->save(); + $pdf = $doc->getPDF(); + + if (!$pdf) { + $this->fail(); + $doc->ocr = "F"; + $this->status("PDF File Missing"); + $doc->save(); + return; + } + + $this->status("Processing " . $doc->filename . " with OCR"); + + $body = $pdf->text()->get_text(); + if ($body == "") { + $this->status("Running OCR on PDF file"); + $ocr = new PDF($pdf->path() . "-ocr.pdf"); + $pdf->ocr($ocr); + $ocr->rename($pdf->path(), true); + $pdf = $doc->getPDF(); + $body = $pdf->text()->get_text(); + } + + $doc->body = $body; + + $docid = IDMatch::find_docid($doc->filename . " " . $body); + if ($docid) { + $doc->ocr_docid = $docid[0]; + } + + $doc->ocr = "Y"; + $doc->save(); + + $this->status("Finished"); + $this->finish(); + return; + } + + + public function uploadcb($percent) { + $this->status("Uploading: " . $percent . "% complete"); + } + + public function processcb($message) { + $this->status($message); + } + +} diff --git a/app/jobs/IndexJob.php b/app/jobs/IndexJob.php new file mode 100644 index 0000000..c819835 --- /dev/null +++ b/app/jobs/IndexJob.php @@ -0,0 +1,47 @@ +revision = $rev; + } + + public function run() { + + $db = DB::getInstance(); + + $rev = new Revision($this->revision); + $rev->load("body"); + $body = $rev->body; + + if ($body) { + $body->counted = 'P'; + $body->save(); + + + $db->query("DELETE FROM word_index WHERE revision=:rev", ["rev" => $rev->id]); + + $words = $body->count_words(); + + foreach ($words as $word=>$hits) { + $db->query("INSERT INTO word_index (revision, word, hits) VALUES (:rev, :word, :hits)", [ + "rev" => $rev->id, + "word" => substr($word, 0, 20), + "hits" => $hits + ]); + } + $body->counted = 'Y'; + $body->save(); + $this->finish(); + } else { + $this->fail(); + $this->status("No body to count"); + } + } +} diff --git a/app/jobs/OCRJob.php b/app/jobs/OCRJob.php new file mode 100644 index 0000000..4a834af --- /dev/null +++ b/app/jobs/OCRJob.php @@ -0,0 +1,43 @@ +revision = $rev; + } + + public function run() { + $ocr = OCR::find([["revision", "=", $this->revision]])->first(); + if (!$ocr) { + $ocr = new OCR; + $ocr->revision = $this->revision; + $ocr->save(); + } + + $this->status("Processing"); + + $rev = new Revision($this->revision); + $pdf = $rev->getPDF(); + $text = $pdf->text()->get_text(); + + print("[" . $text . "]\n"); + + if ($text == "") { + $this->status("Running OCR on PDF"); + $newpdf = new PDF($pdf->parent() . "/ocr.pdf"); + $pdf->ocr($newpdf); + $text = $newpdf->text()->get_text(); + } + + $ocr->body = $text; + $ocr->save(); + $j = new IndexJob($this->revision); + $j->queue(); + $this->status("Complete"); + $this->finish(); + } +} diff --git a/app/jobs/ProcessJob.php b/app/jobs/ProcessJob.php new file mode 100644 index 0000000..b511e54 --- /dev/null +++ b/app/jobs/ProcessJob.php @@ -0,0 +1,18 @@ +docid = $docid; + } + + public function run() { + return false; + } + +} diff --git a/app/jobs/RecompressJob.php b/app/jobs/RecompressJob.php new file mode 100644 index 0000000..5793597 --- /dev/null +++ b/app/jobs/RecompressJob.php @@ -0,0 +1,35 @@ +RevisionID = $id; + } + public function run() { + $this->status("Recompressing"); + $rev = new Revision($this->RevisionID); + $crev = new Revision; + + $crev->revid = $rev->revid; + $crev->save(); + + $from = $rev->getPDF(); + $to = $crev->getPDF(); + + $to->parent()->mkdir(); + $from->recompress($to->path()); + + $crev->document = $rev->document; + $crev->info = $to->info(); + $crev->sha256 = $to->hash(); + $crev->save(); + + $this->status("New revision " . $crev->id); + $this->finish(); + } +} diff --git a/app/jobs/RedownloadJob.php b/app/jobs/RedownloadJob.php new file mode 100644 index 0000000..daa116b --- /dev/null +++ b/app/jobs/RedownloadJob.php @@ -0,0 +1,59 @@ +from = $from; + $this->to = $to; + $this->revid = $revid; + parent::__construct("revision:" . $revid); + } + + public function run() { + $ch = curl_init(); + $this->status("Downloading: 0%"); + $fd = fopen($this->to, "w"); + + curl_setopt($ch, CURLOPT_URL, $this->from); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); + curl_setopt($ch, CURLOPT_PRIVATE, $this); + curl_setopt($ch, CURLOPT_TIMEOUT, 3600); + curl_setopt($ch, CURLOPT_FILETIME, true); + curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, [$this, 'download_progress']); + curl_setopt($ch, CURLOPT_NOPROGRESS, false); + curl_setopt($ch, CURLOPT_FILE, $fd); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + + print("Running...\n"); + $r = curl_exec($ch); + fclose($fd); + $sha = hash_file("sha256", $this->to); + $rev = new Revision($this->revid); + $rev->sha256 = $sha; + $rev->save(); + print("Finished\n"); + $this->finish(); + return; + } + + + + function download_progress($ch, $download_size, $downloaded, $upload_size, $uploaded) { + if ($download_size == 0) return; + $pct = round($downloaded / $download_size * 100); + if ($pct != $this->_pct) { + $this->status("Downloading: " . $pct . "%"); + $this->_pct = $pct; + } + } +} diff --git a/app/models/DocMeta.php b/app/models/DocMeta.php new file mode 100644 index 0000000..c5be432 --- /dev/null +++ b/app/models/DocMeta.php @@ -0,0 +1,13 @@ + "Document", + "metadata" => "MetaType" + ]; + + + + +} diff --git a/app/models/DocProduct.php b/app/models/DocProduct.php new file mode 100644 index 0000000..86f4305 --- /dev/null +++ b/app/models/DocProduct.php @@ -0,0 +1,17 @@ + "Document", + "product" => "Product" + ]; + + + protected $_model = [ + "id" => [MODEL_SERIAL], + "created" => [MODEL_BIGINT, 11], + "updated" => [MODEL_BIGINT, 11], + "document" => [MODEL_OBJECT, "Document"], + "product" => [MODEL_OBJECT, "Product"] + ]; +} diff --git a/app/models/Document.php b/app/models/Document.php new file mode 100644 index 0000000..80b3923 --- /dev/null +++ b/app/models/Document.php @@ -0,0 +1,209 @@ + "get_related", + "revisions" => "get_revisions", + "products" => "get_products", + "metadata" => "get_metadata", + "attachments" => "get_attachments", + ]; + + public function get_revisions() { + return Revision::find([["document", "=", $this->id]])->orderByDesc("rating")->all(); + } + + public function get_related() { + $revs = Revision::find([["document", "=", $this->id]])->all(); + $related = new Collection; + foreach ($revs as $rev) { + $q = DB::getInstance()->query(" + select distinct + id, + internal_id, + title, + subtitle, + subsubtitle + from + document + where + internal_id in ( + select + distinct words.word + from + words, + revwords + where + words.id=revwords.word + and + revwords.revision=:rev + and + words.word like '%-%-%' + )", array("rev" => $rev->id)); + while ($r = DB::getInstance()->nextRecord($q)) { + if ($r->id != $this->id) { + $related->push(new Document($r->id)); + } + } + } + return $related; + } + + public function overview_md() { + return \Michelf\Markdown::defaultTransform($this->overview); + } + + public function on_delete() { + DB::getInstance()->query("delete from docproduct where document=:id", ["id" => $this->id]); + } + + private $_products = null; + + public function get_products() { + if ($this->_products == null) { + + $this->_products = new Collection; + $dpl = DocProduct::find([["document", "=", $this->id]])->all(); + foreach ($dpl as $dp) { + $dp->load("product"); + $this->_products->push($dp->product); + } + } + + return $this->_products; + } + + public function duplicate() { + $newdoc = new Document(); + $newdoc->title = $this->title; + $newdoc->subtitle = $this->subtitle; + $newdoc->subsubtitle = $this->subsubtitle; + $newdoc->overview = $this->overview; + $newdoc->internal_id = $this->internal_id; + $newdoc->owner = $this->owner; + $newdoc->year = $this->year; + $newdoc->month = $this->month; + + $newdoc->save(); + + $dpl = DocProduct::find([["document", "=", $this->id]])->all(); + foreach ($dpl as $dp) { + $ndp = new DocProduct(); + $ndp->document = $newdoc->id; + $ndp->product = $dp->product; + $ndp->save(); + } + return $newdoc; + } + + public function remove_product($id) { + $dp = DocProduct::find([["document", "=", $this->id], ["product", "=", $id]])->first(); + if ($dp) { + $dp->delete(); + } + } + + public function set_metadata($metadata, $value) { + if (!$metadata) return false; + $m = DocMeta::find([["document", "=", $this->id], ["metadata", "=", $metadata]])->first(); + if (!$m) { + $m = new DocMeta(); + $m->document = $this->id; + $m->metadata = $metadata; + } + $m->data = $value; + $m->save(); + return $m->id; + } + + public function get_metadata() { + return DocMeta::find([["document", "=", $this->id]])->all(); + } + + public function remove_metadata($metadata) { + $m = DocMeta::find([["document", "=", $this->id], ["metadata", "=", $metadata]])->first(); + if ($m) { + $m->delete(); + } + } + + public function get_metadata_by_id($metadata) { + $m = DocMeta::find([["document", "=", $this->id], ["metadata", "=", $metadata]])->first(); + if (!$m) { + return ""; + } + return $m->data; + } + + public function guess_docid() { + $text = $this->title . " " . $this->subtitle . " " . $this->subsubtitle; + $text .= $this->overview; + + $words = $this->get_words($text); + + return IDMatch::find_docid($words)[0]; + } + + + function get_words($text) { + $text = str_replace("\r", " ", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n", " ", $text); + $text = str_replace("\"", "", $text); + $text = str_replace(",", " ", $text); + $text = str_replace("—", "-", $text); + $text = str_replace("~", "-", $text); + $text = str_replace("--", "-", $text); + + $text = preg_replace('/([^a-zA-Z\-0-9]+)/', ' ', $text); + + //$text = preg_replace("/([A-Za-z])(- )/", '$1', $text); + + $words = preg_split('/\s+/', $text); + return $words; + } + + + function get_attachments() { + $ap = ROOT . "/attachments/" . $this->id; + $files = new Collection; + if (!file_exists($ap)) { + return $files; + } + if (!is_dir($ap)) { + return $files; + } + + $dir = opendir($ap); + while ($f = readdir($dir)) { + if (substr($f, 0, 1) == ".") continue; + $f = new File($ap . "/" . $f); + $files->push($f); + } + + return $files; + } + + public static function find_by_docid($docid) { + $db = DB::getInstance(); + $q = $db->query("select id from document where internal_id=:docid", ["docid" => $docid]); + if ($r = $db->nextRecord($q)) { + return new Document($r->id); + } + return false; + } + + public function is_incoming() { + foreach ($this->get_products() as $prod) { + if (preg_match("/ Incoming /", $prod->full_path, $m)) { + return true; + } + } + return false; + } + +} diff --git a/app/models/Favourite.php b/app/models/Favourite.php new file mode 100644 index 0000000..3fe10d0 --- /dev/null +++ b/app/models/Favourite.php @@ -0,0 +1,4 @@ +orderBy("weight")->all(); + + foreach ($matches as $match) { + $preg = '/^' . $match->regex . '$/'; + + foreach ($words as $word) { + $word = strtoupper($word); + $word = str_replace("(", "C", $word); + $word = str_replace("=", "-", $word); + $word = str_replace("--", "-", $word); + + if (preg_match($preg, $word, $m)) { + return [$m[1], @$m[2]]; + } + } + } + return false; + } + + public static function get_words($text) { + $text = str_replace("\r", " ", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n\n", "\n", $text); + $text = str_replace("\n", " ", $text); + $text = str_replace("\"", "", $text); + $text = str_replace(",", " ", $text); + $text = str_replace("–", "-", $text); + $text = str_replace("—", "-", $text); + $text = str_replace("~", "-", $text); + $text = str_replace("--", "-", $text); + + $text = preg_replace('/([^a-zA-Z\-0-9]+)/', ' ', $text); + + //$text = preg_replace("/([A-Za-z])(- )/", '$1', $text); + + $words = preg_split('/\s+/', $text); + return $words; + } + + +} diff --git a/app/models/MetaType.php b/app/models/MetaType.php new file mode 100644 index 0000000..501e9cf --- /dev/null +++ b/app/models/MetaType.php @@ -0,0 +1,11 @@ +name; + } +} diff --git a/app/models/OCR.php b/app/models/OCR.php new file mode 100644 index 0000000..9093a04 --- /dev/null +++ b/app/models/OCR.php @@ -0,0 +1,23 @@ +body); + return $t->words(); + } + + public function count_words() { + $words = $this->get_words(); + + $counted = []; + + foreach ($words as $word) { + if (strlen($word) > 2) { + @$counted[strtoupper($word)] ++; + } + } + + return $counted; + } +} diff --git a/app/models/Product.php b/app/models/Product.php new file mode 100644 index 0000000..b0eb593 --- /dev/null +++ b/app/models/Product.php @@ -0,0 +1,163 @@ + "Product" + ]; + + protected $_computed = [ + "documents" => "get_documents", + "children" => "get_children", + ]; + + protected $_triggers = [ + "parent" => "update_path", + "title" => "update_path", + ]; + + private $_children = null; + public function get_children() { + $c = $this->cache_get("children"); + if ($c) return $c; + + if ($this->_children == null) { + $this->_children = Product::find([["parent", "=", $this->id]])->orderBy("title")->all(); + } + $this->cache_set("children", $this->_children); + return $this->_children; + } + + public function get_full_title() { + $tree = $this->get_tree(); + + $n = []; + foreach ($tree as $t) { + $n[] = $t->title; + } + + $out = implode(" / ", $n); + return $out; + } + + public function update_path($ppath = null) { + if ($ppath == null) { + $this->full_path = $this->get_full_title(); + } else { + $this->full_path = $ppath . " / " . $this->title; + } + $this->full_path = str_replace("/ / ", "/ ", $this->full_path); + $this->save(); + foreach ($this->get_children() as $child) { + $child->update_path($this->fill_path); + } + } + + public function get_tree() { + $out = []; + if ($this->load("parent")) { + $p = $this->parent; + $out = $p->get_tree(); + } + array_push($out, $this); + + return $out; + } + + public function overview_md() { + return \Michelf\Markdown::defaultTransform($this->overview); + } + + public function on_delete() { + DB::getInstance()->query("delete from docproduct where product=:id", ["id" => $this->id]); + } + + private $_documents = null; + + public function get_documents() { + + $d = $this->cache_get("documents"); + if ($d) return $d; + + if ($this->_documents == null) { + //$dpl = DocProduct::find([["product", "=", $this->id]])->limit(100)->all(); + $dpl = DocProduct::find([["product", "=", $this->id]])->all(); + $this->_documents = new Collection; + foreach ($dpl as $dp) { + if ($dp->load("document")) { + $this->_documents->push($dp->document); + } + } + + $this->_documents->sort("subsubtitle", true); + $this->_documents->sort("subtitle", true); + $this->_documents->sort("title", true); + } + $this->cache_set("documents", $this->_documents); + return $this->_documents; + } + + public function add_document($doc) { + $dp = new DocProduct; + $dp->product = $this->id; + $dp->document = $doc->id; + $dp->save(); + } + + public function meta() { + if ($this->metadata == null) { + return []; + } + return explode(",", $this->metadata); + } + + public function add_meta($id, $save = true) { + $m = $this->meta(); + if (!in_array($id, $m)) { + $m[] = $id; + } + $this->metadata = implode(",", $m); + if ($save) $this->save(); + } + + public function del_meta($id, $save = true) { + $m = $this->meta(); + $o = []; + foreach ($m as $v) { + if ($v != $id) { + $o[] = $v; + } + } + $this->metadaya = implode(",", $o); + if ($save) $this->save(); + } + + public function documents_sorted_by_meta() { + + if ($this->metadata == null) { + $meta = []; + } else { + $meta = explode(",", $this->metadata); + } + + $docs = $this->get_documents(); + + + while (count($meta) > 0) { + $mid = array_pop($meta); + $docs->sort_with_function( function($a, $b) use ($mid) { + $va = $a->get_metadata_by_id($mid); + $vb = $b->get_metadata_by_id($mid); + + if ($va > $vb) return 1; + if ($va < $vb) return -1; + return 0; + }); + } + + + return $docs; + + } + +} diff --git a/app/models/Revision.php b/app/models/Revision.php new file mode 100644 index 0000000..904e710 --- /dev/null +++ b/app/models/Revision.php @@ -0,0 +1,123 @@ + "Document" + ]; + + protected $_computed = [ + "body" => "get_body", + ]; + + protected $transform = [ + "info" => "json" + ]; + + function path() { + $rs = sprintf("%011d", $this->id); + $d1 = substr($rs, 0, 2); + $d2 = substr($rs, 2, 3); + $d3 = substr($rs, 5, 3); + $d4 = substr($rs, 8, 3); + $p = sprintf("%s/pdf/%s/%s/%s/%s", ROOT, $d1, $d2, $d3, $d4); + return $p; + } + + function filename() { + if ($this->document) { + if (is_numeric($this->document)) { + $this->load("document"); + } + $out = $this->document->internal_id; + if (($this->revno != "") && ($this->revno != "0")) { + $out .= "-"; + $out .= $this->revno; + } + $out .= " "; + $out .= $this->document->title . " " . $this->document->subtitle . " " . $this->document->subsubtitle; + } else { + $out = "doc"; + } + $out = trim($out); + $out.= ".pdf"; + $out = str_replace(" ", "_", $out); + $out = str_replace("/", "_", $out); + return $out; + } + + function create_cover() { + $p = $this->path(); + $pdf = new PDF($p . "/doc.pdf"); + $cover = $p . "/cover.jpg"; + $pdf->extract_page(0, $cover); + } + + function cover($size = null) { + $f = new File($this->path() . "/cover.jpg"); + if (!$f->exists()) { + $this->create_cover(); + } + if ($size == null) { + return "/cover/" . $this->id . "/cover.jpg"; + } + return "/cover/" . $this->id . "/" . $size . "/cover.jpg"; + } + + private $_body = null; + + public function get_body() { + if ($this->_body == null) { + $ocr = OCR::find([["revision", "=", $this->id]])->first(); + if (!$ocr) { + return false; + } + $this->_body = $ocr; + } + return $this->_body; + } + + public function get_page($page, $dpi = 300) { + $file = new File(sprintf("%s/pages/%04d-%d.jpg", $this->path(), $page, $dpi)); + if ($file->exists()) { + return new Image($file); + } + + $dir = sprintf("%s/pages", $this->path()); + if (!file_exists($dir)) { + mkdir($dir, 0777); + } + + $pdf = new PDF(sprintf("%s/doc.pdf", $this->path())); + $img = $pdf->extract_page($page, $file->path(), $dpi); + + if ($img) { + return $img; + } + return null; + } + + public function purge() { + $dir = opendir($this->path()); + while ($file = readdir($dir)) { + if (str_ends_with($file, ".jpg")) { + unlink($this->path() . "/" . $file); + } + } + closedir($dir); + + $dir = opendir($this->path() . "/pages"); + while ($file = readdir($dir)) { + if (str_ends_with($file, ".jpg")) { + unlink($this->path() . "/pages/" . $file); + } + } + closedir($dir); + } + + public function getPDF() { + $p = $this->path(); + $pdf = new PDF($p . "/doc.pdf"); + return $pdf; + } +} diff --git a/app/models/Spider.php b/app/models/Spider.php new file mode 100644 index 0000000..c12634b --- /dev/null +++ b/app/models/Spider.php @@ -0,0 +1,4 @@ + "get_documents", + ]; + + public function get_documents() { + $docs = SystemDoc::find([["system", "=", $this->id]])->all(); + $dl = new Collection; + foreach ($docs as $d) { + $doc = new Document($d->document); + if ($doc) { + $dl->add($doc); + } + } + $dl->sort("title"); + return $dl; + } + +} diff --git a/app/models/SystemDoc.php b/app/models/SystemDoc.php new file mode 100644 index 0000000..4897d6a --- /dev/null +++ b/app/models/SystemDoc.php @@ -0,0 +1,5 @@ +id . ".pdf"); + } +} diff --git a/app/models/User.php b/app/models/User.php new file mode 100644 index 0000000..4954c6f --- /dev/null +++ b/app/models/User.php @@ -0,0 +1,43 @@ +id], + ["document", "=", $doc]])->first(); + if ($f) { + return true; + } + return false; + } + + public function set_favourite($doc) { + $f = Favourite::find([ + ["owner", "=", $this->id], + ["document", "=", $doc]])->first(); + if (!$f) { + $f = new Favourite; + $f->owner = $this->id; + $f->document = $doc; + $f->save(); + } + } + + public function unset_favourite($doc) { + $f = Favourite::find([ + ["owner", "=", $this->id], + ["document", "=", $doc]])->first(); + if ($f) { + $f->delete(); + } + } + + public function favourites() { + $f = Favourite::find([ + ["owner", "=", $this->id], + ])->all(); + return $f; + } +} diff --git a/backend/JobRunner b/backend/JobRunner new file mode 100755 index 0000000..cdd5891 --- /dev/null +++ b/backend/JobRunner @@ -0,0 +1,45 @@ +#!/usr/bin/env php +getJobClass() . " job " . $job->jobID() . "\n"); + try { + $job->run(); + } catch (PDOException $e) { + print_r($e); + } catch (Exception $e) { + print_r($e); + } + print("Job finished\n"); + } else { + sleep(1); + } + + if (file_exists("/tmp/dpr_jobrunner_quit")) { + unlink("/tmp/dpr_jobrunner_quit"); + $running = false; + } +} + +print("Job Runner Exited Cleanly\n"); diff --git a/backend/JobRunnerQuit b/backend/JobRunnerQuit new file mode 100755 index 0000000..ed076c1 --- /dev/null +++ b/backend/JobRunnerQuit @@ -0,0 +1,5 @@ +#!/usr/bin/env php + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dot.env.sample b/dot.env.sample new file mode 100644 index 0000000..87bd181 --- /dev/null +++ b/dot.env.sample @@ -0,0 +1,15 @@ + +URL=https://decpdf.site + +DEBUG=true + +DB_HOST=host +DB_USER=user +DB_PASS=pass +DB_DATABASE=db + +GEMINI_KEY=["3fefyhwp98eoyepoytpotywpertferyrtyueoru", "flcs8yli8ty89weylicu4ynkeuhgkdshei8rhcn"] +GEMINI_MODEL=gemini-3.1-flash-lite + +MAGICK=convert + diff --git a/lib/AntiSpam.php b/lib/AntiSpam.php new file mode 100755 index 0000000..13d42cc --- /dev/null +++ b/lib/AntiSpam.php @@ -0,0 +1,12 @@ +type(), $req->path()); + if ($apiroute !== false) { // It is an API route. Treat it as such. + $req->set_route($apiroute); + $out = $apiroute->call($req); + header("Content-type: application/json"); + if ($out instanceof Collection) { + print(json_encode($out->all())); + return; + } + if (is_array($out)) { // This is an array return type. Do things depending on the result key + + $status = $out[0]; + $data = $out[1]; + if (count($out) > 2) { + $headers = $out[2]; + } else { + $headers = []; + } + + header("HTTP/1.1 $status"); + foreach ($headers as $k=>$v) { + header("$k: $v"); + } + if (is_array($data)) { + print(json_encode($data)); + } else { + print($data); + } + return; + } + print(json_encode($out)); + return; + } + + $webroute = Routes::find_web($req->type(), $req->path()); + if ($webroute !== false) { // It is a WEB route. Treat it as such. + $req->set_route($webroute); + $out = $webroute->call($req); + if (is_array($out)) { // This is an array return type. Do things depending on the result key + + $status = $out[0]; + $data = $out[1]; + if (count($out) > 2) { + $headers = $out[2]; + } else { + $headers = []; + } + + header("HTTP/1.1 $status"); + foreach ($headers as $k=>$v) { + header("$k: $v"); + } + print($data); + return; + } + + if ($out instanceof File) { + $out->set_header("Content-Length", $out->size()); + $out->emit(); + return; + } + + print($out); + return; + } + + header("HTTP/1.1 404 Not Found"); + print(blade("404")); + + } +} diff --git a/lib/Auth.php b/lib/Auth.php new file mode 100755 index 0000000..9aae588 --- /dev/null +++ b/lib/Auth.php @@ -0,0 +1,183 @@ +post("current"); + $chash = hash("sha256", $current); + if ($chash != $user->password) { + flash("error", "Wrong password. Try again."); + return redirect("/account"); + } + + $p1 = $_request->post("pass1"); + $p2 = $_request->post("pass2"); + + if ($p1 != $p2) { + flash("error", "Your new passwords don't match."); + return redirect("/account"); + } + + if (strlen($p1) < 6) { + flash("error", "Your new password is too short. Pick one that is 6 characters or more."); + return redirect("/account"); + } + + + $user->password = hash("sha256", $p1); + $user->save(); + flash("success", "Your password has been changed."); + return redirect("/account"); + } + + static function account($tab = "account") { + $session = Session::all_data(); + return blade("account", ["tab" => $tab, "session" => $session, "user" => get_user()]); + } + + static function can_upload() { + $user = get_user(); + if (!$user) return false; + return $user->can_upload == "Y"; + } + + static function can_moderate() { + $user = get_user(); + if (!$user) return false; + return $user->can_moderate == "Y"; + } + + static function register() { + if (array_key_exists("HTTP_REFERER", $_SERVER)) { + Session::set("login_return", $_SERVER['HTTP_REFERER']); + } else { + Session::set("login_return", "/"); + } + return blade("register", ["username" => "", "email" => "", "password" => "", "confirm" => ""]); + } + + static function do_register($_request) { + $username = $_request->post("username"); + $email = $_request->post("email"); + $password = $_request->post("password"); + $confirm = $_request->post("confirm"); + + if ($username == "") { + flash("error", "You haven't provided a username."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + if (!preg_match("#^[a-zA-Z0-9_\-]+$#", $username)) { + flash("error", "Username contains invalid characters. Use letters, numbers, _ and - only."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + if (strlen($username) > 20) { + flash("error", "Username is too long. Keep it under 20 characters."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + if ($email == "") { + flash("error", "You haven't provided an email address."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + if (strlen($password) < 6) { + flash("error", "You need to give a password of at least 6 characters."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + if ($password != $confirm) { + flash("error", "Your two passwords do not match."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + flash("error", "Your email address doesn't appear to be valid."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + $exist = User::find([["username", "=", strtolower($username)]])->first(); + if ($exist) { + flash("error", "That username has already been taken. Pick another."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + $exist = User::find([["email", "=", $email]])->first(); + if ($exist) { + flash("error", "An account with that email address already exists."); + return blade("register", ["username" => $username, "email" => $email, "password" => $password, "confirm" => $confirm]); + } + + $u = new User; + $u->username = $username; + $u->email = $email; + $u->password = hash("sha256", $password); + $u->save(); + + Session::set("user", $u->id); + + + flash("success", "Registration successful. You have also been automatically logged in."); + $ret = Session::get("login_return"); + return redirect($ret); + + } + + static function logged_in() { + $user = get_user(); + return $user !== false; + } + + static function do_login() { + $username = $_POST['username']; + $password = $_POST['password']; + + if (!$username) return blade("login"); + if (!$password) return blade("login"); + + $user = User::find([["username", "=", $username]])->first(); + if (!$user) { + $user = User::find([["email", "=", $username]])->first(); + } + + $pwe = hash("sha256", $password); + if ($pwe == $user->password) { + Session::set("user", $user->id); + flash("success", "Log in successful"); + $ret = Session::get("login_return"); + return redirect($ret); + } + flash("error", "Invalid username or password."); + return blade("login"); + } + + public static function login() { + if (array_key_exists("HTTP_REFERER", $_SERVER)) { + Session::set("login_return", $_SERVER['HTTP_REFERER']); + } else { + Session::set("login_return", "/"); + } + return blade("login"); + } + + public static function logout() { + Session::unset("user"); + return redirect($_SERVER['HTTP_REFERER']); + } + +} + + diff --git a/lib/Collection.php b/lib/Collection.php new file mode 100755 index 0000000..373e2e3 --- /dev/null +++ b/lib/Collection.php @@ -0,0 +1,193 @@ +records = $data; + } else { + $this->records = []; + } + } + + public function add($val) { + $this->records[] = $val; + } + + public function first() { + if (count($this->records) == 0) return null; + return $this->records[0]; + } + + public function last() { + if (count($this->records) == 0) return null; + return $this->records[count($this->records)-1]; + } + + public function pop() { + if (count($this->records) == 0) return null; + return array_pop($this->records); + } + + public function shift() { + if (count($this->records) == 0) return null; + return array_shift($this->records); + } + + public function push($val) { + return array_push($this->records, $val); + } + + public function unshift($val) { + return array_unshift($this->records, $val); + } + + public function get($n) { + return isset($this->records[$offset]) ? $this->records[$offset] : null; + } + + public function all() { + return $this->records; + } + + // Countable + public function count() : int { + return count($this->records); + } + + // Iterator + public function rewind() : void { + $this->position = 0; + } + + public function current() : mixed { + return $this->records[$this->position]; + } + + public function key() : mixed { + return $this->position; + } + + public function next() : void { + ++$this->position; + } + + public function valid() : bool { + return isset($this->records[$this->position]); + } + + // ArrayAccess + public function offsetSet($offset, $value) : void { + if (is_null($offset)) { + $this->push($value); + } else { + $this->records[$offset] = $value; + } + } + + public function offsetExists($offset) : bool { + return isset($this->records[$offset]); + } + + public function offsetUnset($offset) : void { + unset($this->records[$offset]); + } + + public function offsetGet($offset) : mixed { + return isset($this->records[$offset]) ? $this->records[$offset] : null; + } + + public function each($f) { + if ($f instanceof Closure) { + foreach ($this->records as $r) { + $f->call($this, $r); + } + return; + } + + if (is_array($f)) { + if (method_exists($f[0], $f[1])) { + $cl = $f[0]; + $fun = $f[1]; + foreach ($this->records as $r) { + $cl::$fun($r); + } + } + return; + } + } + + public function sort($field, $ins=false) { + usort($this->records, function ($a, $b) use ($field,$ins) { + + $aa = $a->$field; + $bb = $b->$field; + + if ($ins) { + $aa = strtolower_null($aa); + $bb = strtolower_null($bb); + } + + if ($aa > $bb) { + return 1; + } + + if ($aa < $bb) { + return -1; + } + return 0; + }); + } + + public function sort_with_function($func) { + usort($this->records, $func); + } + + + public function range($start, $len = 0) { + + if ($len == 0) { + // 0 .. $start + return array_splice($this->records, 0, $start); + } + + return array_splice($this->records, $start, $len); + } + + public function glob($key, $pattern) { + $nc = new Collection; + + foreach ($this->records as $r) { + if (fnmatch(strtolower_null($pattern), strtolower_null($r->$key))) { + $nc->push($r); + } + } + return $nc; + } + + public function merge($other) { + $o = new Collection; + foreach ($this->records as $r) { + $o->push($r); + } + foreach ($other->all() as $r) { + $o->push($r); + } + return $o; + } + + public static function from_array($arr) { + $c = new Collection(); + foreach ($arr as $k=>$v) { + $ob = new stdClass; + $ob->key = $k; + $ob->value = $v; + $c->pusk($ob); + } + return $c; + } +} diff --git a/lib/Config.php b/lib/Config.php new file mode 100755 index 0000000..70ad5fc --- /dev/null +++ b/lib/Config.php @@ -0,0 +1,32 @@ +db = new \PDO("mysql:dbname=$dbname;host=$dbhost;charset=utf8mb4",$dbuser,$dbpass); + //$this->query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); + } + + function query($query,$params = array()) { + $q = $this->db->prepare($query); + $q->execute($params); + $e = $q->errorInfo(); + if($e[0]!='00000') { + print ""; + print $e[2]; + print ""; + return false; + } + return $q; + } + + function nextRecord($query) { + $next = $query->fetchObject(); + return $next; + } + + function id() { + return $this->db->lastInsertId(); + } + + function update($table,$id,$data) { + $values = array(); + foreach($data as $k=>$v) { + $values[] = "`" . $k . "`" . "=:" . $k; + } + $query = sprintf("UPDATE `%s` set " . implode(",",$values) . " WHERE id=:id",$table); + $data['id'] = $id; + + $q = $this->query($query,$data); + $id = $this->id(); + return $id; + } + + function insert($table,$data) { + $fields = array(); + $values = array(); + foreach($data as $k=>$v) { + $fields[] = $k; + $values[] = ":" . $k; + } + $query = sprintf("INSERT IGNORE INTO `%s` (" . implode(",",$fields) . ") VALUES (" . implode(",",$values) . ")",$table); + $q = $this->query($query,$data); + $id = $this->id(); + return $id; + } + + function set($table,$record,$field,$value) { + $this->query("UPDATE `$table` SET `$field`=:f WHERE id=:i",array( + 'f'=>$value, + 'i'=>$record + )); + } + + function select($table,$record) { + $query = sprintf("SELECT * FROM `%s` WHERE id=:id",$table); + $q = $this->query($query,array("id" => $record)); + $r = $this->nextRecord($q); + return $r; + } + + function getTableStructure($table) { + $query = sprintf("DESCRIBE `%s`", $table); + $q = $this->query($query); + $fields = []; + + while ($r = $this->nextRecord($q)) { + $field = $r['Field']; + $type = $r['Type']; + $extra = $r['Extra']; + + $fingerprint = trim("$type $extra"); + + $f = new stdClass; + $f->name = $field; + + if (preg_match('/^(.*)\((\d+)\)(.*)$/', $fingerprint, $m)) { + $fingerprint = $m[1] . $m[3]; + $f->length = $m[2]; + } + + + $f->type == -1; + $f->unsigned = false; + + switch ($fingerprint) { + case "bigint unsigned auto_increment": $f->type = MODEL_SERIAL; break; + + case "text": $f->type = MODEL_TEXT; break; + case "longtext": $f->type = MODEL_TEXT; break; + + case "blob": $f->type = MODEL_TEXT; break; + case "longblob": $f->type = MODEL_TEXT; break; + + case "tinyint": $f->type = MODEL_TINYINT; break; + case "tinyint unsigned": $f->type = MODEL_TINYINT; $f->unsigned = true; break; + + case "int": $f->type = MODEL_INT; break; + case "int unsigned": $f->type = MODEL_INT; $f->unsigned = true; break; + + case "bigint": $f->type = MODEL_BIGINT; break; + case "bigint unsigned": $f->type = MODEL_BIGINT; $f->unsigned = true; break; + + case "char": $f->type = MODEL_CHAR; break; + case "varchar": $f->type = MODEL_VARCHAR; break; + } + } + } + + public function all($query) { + $o = new Collection; + while ($r = $this->nextRecord($query)) { + $o->push($r); + } + return $o; + } +} + diff --git a/lib/ErrorHandler.php b/lib/ErrorHandler.php new file mode 100755 index 0000000..77a3a45 --- /dev/null +++ b/lib/ErrorHandler.php @@ -0,0 +1,103 @@ + += count($l)) $end = count($l) -1; + + $out = []; + for ($i = $start; $i <= $end; $i++) { + $out[] = $l[$i]; + } + return $out; + } + + public static function handleException($e) { + header("Content-Type: text/html"); + header("X-Error-Message: " . $e->getMessage()); + header("X-Error-Line: " . $e->getLine()); + header("X-Error-File: " . $e->getFile()); + header("X-Error-Code: " . $e->getCode()); + $trace = $e->getTrace(); + array_shift($trace); + + $i = 0; + foreach ($trace as $t) { + $i++; + header("X-Error-Trace-" . $i . ": " . $t['file'] . "(" . $t['line'] . ")"); + } + + print("
"); + print("

" . $e->getMessage() . "

"); + print("At Line " . $e->getLine() . " of " . $e->getFile() . "
"); + + $line = $e->getLine() - 1; + + $pre = ErrorHandler::getFileLines($e->getFile(), $line - 5, $line - 1); + $line = ErrorHandler::getFileLines($e->getFile(), $line, $line); + $post = ErrorHandler::getFileLines($e->getFile(), $line + 1, $line + 5); + + print("
");
+
+		foreach ($pre as $l) {
+			print($l . "\n");
+		}
+		print($line[0] . " <---\n");
+		foreach ($post as $l) {
+			print($l . "\n");
+		}
+
+		print("
"); + print("
"); + + $trace = $e->getTrace(); + array_shift($trace); + + foreach ($trace as $t) { + if (array_key_exists("class", $t) && array_key_exists("function", $t)) { + print("
"); + print("
From " . $t['class'] . "::" . $t['function'] . "
"); + print("At Line " . $t['line'] . " of " . $t['file'] . "
"); + print("
"); + } + + } + + } + + public static function handleError($num, $str, $file, $line, $context = null) { + ErrorHandler::handleException(new ErrorException($str, 0, $num, $file, $line)); + } + + public static function hook() { + + if (Config::get("DEBUG")) { + ini_set("display_errors", "on"); + error_reporting(E_ALL); + } else { + ini_set("display_errors", "off"); + } +// register_shutdown_function("ErrorHandler::checkForFatalCrash"); +// set_error_handler("ErrorHandler::handleError"); +// set_exception_handler("ErrorHandler::handleException"); + } + +} diff --git a/lib/File.php b/lib/File.php new file mode 100755 index 0000000..b1d426c --- /dev/null +++ b/lib/File.php @@ -0,0 +1,128 @@ +_path = $path->path(); + } + + $this->_path = $path; + } + + public function basename() { + return pathinfo($this->_path, PATHINFO_BASENAME); + } + + public function dirname() { + return pathinfo($this->_path, PATHINFO_DIRNAME); + } + + public function extension() { + return pathinfo($this->_path, PATHINFO_EXTENSION); + } + + public function filename() { + return pathinfo($this->_path, PATHINFO_FILENAME); + } + + public function delete() { $this->unlink(); } + public function unlink() { + unlink($this->_path); + } + + public function content() { + return get_file_contents($this->_path); + } + + public function emit() { + $headers = $this->_headers; + + $headers['ETag'] = "\"" . $this->hash() . "\""; + + foreach ($headers as $k=>$v) { + header($k . ": " . $v); + } + readfile($this->_path); + } + + public function set_headers($data) { + $this->_headers = $data; + } + + public function get_headers() { + return $this->_headers; + } + + public function set_header($k, $v) { + $this->_headers[trim($k)] = trim($v); + } + + public function exists() { + return file_exists($this->_path); + } + + public function size() { + return stat($this->_path)["size"]; + } + + public function path() { + return $this->_path; + } + + public function mime() { + if (!file_exists($this->_path)) { + return false; + } + return mime_content_type($this->_path); + } + + public function __toString() { + return $this->_path; + } + + public function parent() { + $p = $this->dirname(); + if ($p == "") { + return false; + } + return new File($p); + } + + public function mkdir() { + $p = $this->parent(); + if ($p) { + if (!$p->exists()) { + $p->mkdir(); + } + } + + if (!$this->exists()) { + mkdir($this->_path, 0777); + } + } + + public function hash($type = "sha256") { + return hash_file($type, $this->_path); + } + + public function rename($to, $over=false) { + if ($to == $this->path()) return false; + if ((!$over) && file_exists($to)) return false; + copy($this->path(), $to); + if (!file_exists($to)) return false; + unlink($this->path()); + $this->_path = $to; + return true; + } + + public function get_chunk($from, $len) { + $f = fopen($this->_path, "r"); + fseek($f, $from); + $data = fread($f, $len); + fclose($f); + return $data; + } +} diff --git a/lib/Form.php b/lib/Form.php new file mode 100755 index 0000000..8b7666c --- /dev/null +++ b/lib/Form.php @@ -0,0 +1,44 @@ +$v) { + $at[] = "$k = \"$v\""; + } + + return blade("forms.input", [ + "title" => $title, + "name" => $name, + "value" => $value, + "attrs" => implode(" ", $at) + ]); + } + + public static function password($title, $name, $value, $attrs = []) { + $at = []; + foreach ($attrs as $k=>$v) { + $at[] = "$k = \"$v\""; + } + + return blade("forms.password", [ + "title" => $title, + "name" => $name, + "value" => $value, + "attrs" => implode(" ", $at) + ]); + } + + public static function submit($title, $attrs = []) { + $at = []; + foreach ($attrs as $k=>$v) { + $at[] = "$k = \"$v\""; + } + + return blade("forms.submit", [ + "title" => $title, + "attrs" => implode(" ", $at) + ]); + } +} diff --git a/lib/Gemini.php b/lib/Gemini.php new file mode 100644 index 0000000..35ed002 --- /dev/null +++ b/lib/Gemini.php @@ -0,0 +1,289 @@ +parameters[$param->name] = $param; + } + + public function get_parameters() { + $o = []; + foreach ($this->parameters as $name=>$param) { + $o[$name] = $param->get_object(); + } + return $o; + } + + public function get_required() { + $o = []; + foreach ($this->parameters as $name=>$param) { + if ($param->required) { + $o[] = $name; + } + } + return $o; + } + + public static function get_key() { + Config::refresh(); + $keys = Config::get("GEMINI_KEY"); + if (!is_array($keys)) return $keys; + return $keys[rand(0, count($keys)-1)]; + } + + public function attach($name, File $file) { + $o = new stdClass; + $o->uri = null; + $o->name = $name; + $o->file = $file; + $this->attachments[$name] = $o; + } + + public function upload_file($name, File $file, $key = false) { + + if ($file->size() > 50000000) { + throw new Exception("File too large"); + } + + set_time_limit(300); + + if ($this->verbose) { + print("Uploading file...\n"); + flush(); + } + $cb = false; + + if ($this->_upload_callback) { + $cb = $this->_upload_callback; + } + + if ($cb) $cb(0); + + + if ($key == false) { + $key = Gemini::get_key(); + } + + $json = "{'file': {'display_name': '" . $name . "'}}"; + + if ($this->verbose) { + print("Upload data: " . $json . "\n"); + flush(); + } + + + $h = new HTTPRequest(); + + $r = $h->post($this->root . "/upload/v1beta/files", $json, [ + "x-goog-api-key: " . $key, + "Content-Type: application/json", + "X-Goog-Upload-Protocol: resumable", + "X-Goog-Upload-Command: start", + "X-Goog-Upload-Header-Content-Length: " . $file->size(), + "X-Goog-Upload-Header-Content-Type: " . $file->mime() + ]); + + if ($this->verbose) { + print("Request data:\n"); + print_r($h); + flush(); + } + + if ($r != 200) { + throw new Exception("Error uploading file to Gemini", $r); + } + + $url = $h->headers['x-goog-upload-url']; + $chunksize = $h->headers['x-goog-upload-chunk-granularity']; + + $size = $file->size(); + $s = $size; + + $pos = 0; + + while ($s > 0) { + + $chunk = min($s, $chunksize); + + $pct = round($pos / $size * 100); + if ($cb) $cb($pct); + + if ($this->verbose) { + printf("***** %d%%\n", round($pct)); + flush(); + } + + $data = $file->get_chunk($pos, $chunk); + $s -= $chunk; + + $fin = $s == 0 ? ", finalize" : ""; + + $r = $h->post($url, $data, [ + "Content-Length: " . $chunk, + "X-Goog-Upload-Offset: " . $pos, + "X-Goog-Upload-Command: upload$fin" + ]); + + if ($r != 200) { + throw new Exception("Error uploading chunk $pos to Gemini", $r); + } + + if ($this->verbose) { + print_r($r); + flush(); + } + + $pos += $chunk; + } + + $d = json_decode($h->body); + + if ($this->verbose) { + print("Final returned body:\n"); + print_r($d); + } + + if ($cb) $cb(100); + return $d->file->uri; + } + + + public function geminiOverview() { + + $cb = false; + if ($this->_process_callback) $cb = $this->_process_callback; + + if ($cb) $cb("Uploading files"); + + if ($this->verbose) { + print("
");
+		}
+
+		$key = Gemini::get_key();
+
+		if (count($this->attachments) == 0) {
+			throw new Exception("No files to upload");
+		}
+
+		foreach ($this->attachments as $name=>$file) {
+			$file->uri = $this->upload_file($name, $file->file, $key);
+		}
+
+		$system = [];
+
+		$system[] = "Summarize the attached PDF document.";
+
+
+		$parts = [];
+		$text = new stdClass;
+		$text->text = implode("\n", $system);
+		$parts[] = $text;
+
+		foreach ($this->attachments as $name=>$file) {
+			$f = new stdClass;
+			$f->file_data = new stdClass;
+			$f->file_data->mime_type = $file->file->mime();
+			$f->file_data->file_uri = $file->uri;
+			$parts[] = $f;
+		}
+
+		$ob = [
+			"contents" => [[
+				"parts" => $parts
+			]],
+			"generationConfig" => [
+				"responseMimeType" => "application/json",
+				"responseSchema" => [
+					"type" => "object",
+					"properties" => $this->get_parameters(),
+					"required" => $this->get_required(),
+				]
+			]
+		];
+
+		$json = json_encode($ob, JSON_PRETTY_PRINT);
+
+		if ($this->verbose) {
+			print("AI reuqest: " . $json . "\n");
+			flush();
+		}
+		set_time_limit(300);
+
+
+		if ($cb) $cb("Sending request");
+
+		$h = new HTTPRequest();
+		$r = $h->post($this->root . "/v1beta/models/" . Config::get("GEMINI_MODEL") . ":generateContent", $json, [
+			"x-goog-api-key: " . $key,
+			"Content-Type: application/json"
+		]);
+
+		if ($cb) $cb("Processing response");
+
+		if ($this->verbose) {
+			print("AI Response:\n");
+			print_r($h);
+			flush();
+		}
+
+		$resp = json_decode($h->body);
+
+		if ($r != 200) {
+			if (@$resp->error) {
+				throw new Exception($resp->error->message, $resp->error->code);
+			} else {
+				throw new Exception("HTTP Error $r requesting AI assistance", $r);
+			}
+		}
+
+		if (property_exists($resp, "candidates")) {
+			$text = $resp->candidates[0]->content->parts[0]->text;
+			$lines = explode("\n", $text);
+
+			$lastLine = "";
+			$out = [];
+			foreach ($lines as $line) {
+				if (str_starts_with($line, "* ") and !str_starts_with($lastLine, "* ")) {
+					$lastLine = $line;
+					$line = "\n" . $line;
+				} else if (str_starts_with($line, "1. ") and (trim($lastLine) != "")) {
+					$lastLine = $line;
+					$line = "\n" . $line;
+				} else {
+					$lastLine = $line;
+				}
+
+				$out[] = $line;
+			}
+
+		
+			return implode("\n", $out);
+		}
+
+		throw new Exception("Content missing processing AI data", 0);
+	}
+
+	public function upload_callback(callable $cb) {
+		$this->_upload_callback = $cb;
+	}
+
+	public function process_callback(callable $cb) {
+		$this->_process_callback = $cb;
+	}
+}
diff --git a/lib/GeminiParameter.php b/lib/GeminiParameter.php
new file mode 100644
index 0000000..82613c3
--- /dev/null
+++ b/lib/GeminiParameter.php
@@ -0,0 +1,55 @@
+name = $n;
+		$this->type = $t;
+		$this->description = $d;
+		$this->required = $r;
+		$this->children = [];
+		$this->enum = [];
+	}
+
+	public function add_enum($e) {
+		$this->enum[] = $e;
+	}
+
+	public function add_child($n, $t, $d, $r = false) {
+		$p = new GeminiParameter($n, $t, $d, $r);
+		$this->children[$n] = $p;
+		return $p;
+	}
+
+	public function get_object() {
+		$o = new stdClass;
+		$o->type = $this->type;
+		$o->description = $this->description;
+		switch ($this->type) {
+			case "string":
+				if (count($this->enum) > 0) {
+					$o->format = "enum";
+					$o->enum = $this->enum;
+				}
+				break;
+			case "object":
+				$o->properties = [];
+				$o->required = [];
+				foreach ($this->children as $cn=>$c) {
+					$o->properties[$cn] = $c->get_object();
+					if ($c->required) {
+						$o->required[] = $cn;
+					}
+				}
+				break;
+			
+		}
+		return $o;
+	}
+}
diff --git a/lib/HTTPRequest.php b/lib/HTTPRequest.php
new file mode 100644
index 0000000..d367930
--- /dev/null
+++ b/lib/HTTPRequest.php
@@ -0,0 +1,112 @@
+ch = curl_init();
+	}
+
+	public function get($url, $headers = [], $headersonly = false) {
+		curl_reset($this->ch);
+	    curl_setopt($this->ch, CURLOPT_URL, $url);
+		curl_setopt($this->ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0");
+		curl_setopt($this->ch, CURLOPT_FILETIME, true);
+		curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $this->connect_timeout);
+		curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->transfer_timeout);
+        curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers);
+		curl_setopt($this->ch, CURLOPT_NOBODY, $headersonly);
+		curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($this->ch, CURLOPT_HEADER, true);
+		curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
+
+		$this->status = 0;
+		$response = curl_exec($this->ch);
+
+		$header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
+		$header = substr($response, 0, $header_size);
+		$this->body = substr($response, $header_size);
+		$this->headers = [];
+
+		foreach ($hl as $h) {
+			$h = trim($h);
+			if (preg_match('/^HTTP\/([^\s]+)\s+(\d+)\s*/', $h, $m)) {
+				$this->version = $m[1];
+				$this->status = $m[2];
+				continue;
+			}
+			if (str_starts_with($h, " ")) {
+				$this->headers[$curr] .= " " . trim($h);
+				continue;
+			}
+			if (preg_match('/^([^:]+):\s+(.*)$/', $h, $m)) {
+				$curr = strtolower($m[1]);
+				$this->headers[$curr] = $m[2];
+			}
+		}
+
+		return $this->status;
+
+	}
+
+
+	public function post($url, $data, $headers = [], $headersonly = false) {
+
+
+		curl_reset($this->ch);
+	    curl_setopt($this->ch, CURLOPT_URL, $url);
+		curl_setopt($this->ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0");
+		curl_setopt($this->ch, CURLOPT_POST, true);
+		curl_setopt($this->ch, CURLOPT_FILETIME, true);
+		curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $this->connect_timeout);
+		curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->transfer_timeout);
+        curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers);
+		curl_setopt($this->ch, CURLOPT_NOBODY, $headersonly);
+		curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($this->ch, CURLOPT_HEADER, true);
+		curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
+		curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
+
+		$this->status = 0;
+
+		$response = curl_exec($this->ch);
+
+		$header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
+		$header = substr($response, 0, $header_size);
+		$this->body = substr($response, $header_size);
+		$this->headers = [];
+
+		$hl = explode("\n", $header);
+
+		foreach ($hl as $h) {
+			$h = trim($h);
+			if (preg_match('/^HTTP\/([^\s]+)\s+(\d+)\s*/', $h, $m)) {
+				$this->version = $m[1];
+				$this->status = $m[2];
+				continue;
+			}
+			if (str_starts_with($h, " ")) {
+				$this->headers[$curr] .= " " . trim($h);
+				continue;
+			}
+			if (preg_match('/^([^:]+):\s+(.*)$/', $h, $m)) {
+				$curr = strtolower($m[1]);
+				$this->headers[$curr] = $m[2];
+			}
+		}
+
+		return $this->status;
+
+	}
+
+
+}
diff --git a/lib/Image.php b/lib/Image.php
new file mode 100755
index 0000000..b5adb78
--- /dev/null
+++ b/lib/Image.php
@@ -0,0 +1,124 @@
+path();
+		}
+
+		if ($h === null) {
+			parent::__construct($w);
+			$this->_type = $this->mime();
+		} else {
+			$this->_img = ImageCreateTrueColor($w, $h);
+		}
+
+	}
+
+	public function getImage() {
+		if ($this->_img == null) {
+			if ($this->_type === false) {
+				$this->_img = ImageCreateTrueColor(1, 1);
+			} else {
+				switch ($this->_type) {
+					case "image/png":
+						$this->_img = ImageCreateFromPNG($this->path());
+						break;
+					case "image/jpeg":
+						$this->_img = ImageCreateFromJPEG($this->path());
+						break;
+					case "image/gif":
+						$this->_img = ImageCreateFromGIF($this->path());
+						break;
+				}
+			}
+		}
+		return $this->_img;
+	}
+
+	public function save($fn = null, $type = null) {
+		$newimg = true;
+		if ($fn == null) {
+			$fn = $this->path();
+			$newimg = false;
+		}
+		if ($type == null) {
+			$type = $this->_type;
+			$newimg = false;
+		}
+
+		switch ($type) {
+			case "image/png":
+				ImagePNG($this->getImage(), $fn);
+				break;
+			case "image/jpeg":
+				ImageJPEG($this->getImage(), $fn);
+				break;
+			case "image/gif":
+				ImageGIF($this->getImage(), $fn);
+				break;
+			default:
+				throw new Exception("Invalid mime type $type specified");
+		}
+		if ($newimg) {
+			return new Image($fn);
+		}
+		return $this;
+	}
+
+	public function width() {
+		return ImageSX($this->getImage());
+	}
+
+	public function height() {
+		return ImageSY($this->getImage());
+	}
+
+	public function scale($w, $h = 0) {
+
+		$sx = $this->width();
+		$sy = $this->height();
+		$dx = $w;
+
+		if ($h == 0) {
+			$aspect = $sx / $sy;
+			$dy = (int)($dx / $aspect);
+		} else {
+			$dh = $h;
+		}
+
+		$new = ImageCreateTrueColor($dx, $dy);
+		ImageCopyResampled($new, $this->getImage(), 0, 0, 0, 0, (int)$dx, (int)$dy, (int)$sx, (int)$sy);
+		ImageDestroy($this->getImage());
+
+		$this->_img = $new;
+			
+	}
+
+	public function emit() {
+		$this->set_header("Content-Type", $this->_type);
+		$this->set_header("Cache-Control", "public, max-age=86400, must-revalidate");
+		$this->set_header("Content-Disposition", "inline; filename=" . $this->basename());
+
+		parent::emit();
+	}
+
+	public function color($r, $g, $b) {
+		return ImageColorAllocate($this->getImage(), $r, $g, $b);
+	}
+
+	public function clear($c) {
+		ImageFilledRectangle($this->getImage(), 0, 0, $this->width(), $this->height(), $c);
+	}
+
+	public function text($x, $y, $t, $c, $f) {
+		ImageString($this->getImage(), $f, $x, $y, $t, $c);
+	}
+
+}
diff --git a/lib/Job.php b/lib/Job.php
new file mode 100644
index 0000000..de3a0bb
--- /dev/null
+++ b/lib/Job.php
@@ -0,0 +1,157 @@
+_source = $source;
+	}
+
+	// Implement this function to actually do the job
+	abstract public function run();
+
+	// Place the current job onto the queue ready for processing.
+	public function queue($owner = -1) {
+        $class = get_called_class();
+		$data = serialize($this);
+		$db = DB::getInstance();
+
+		if ($owner == -1) {
+			$user = get_user();
+			if ($user) {
+				$owner = $user->id;
+			}
+		}
+
+		$this->_jobid = $db->insert("job", [
+			"class" => $class,
+			"data" => $data,
+			"queued" => time(),
+			"source" => $this->_source,
+			"status" => "Queued",
+			"owner" => $owner
+		]);
+
+		return $this->_jobid;
+	}
+
+	public function getJobClass() {
+        $class = get_called_class();
+		return $class;
+	}
+
+	public function jobID() {
+		return $this->_jobid;
+	}
+
+	public function setJobID($id) {
+		$this->_jobid = $id;
+	}
+
+	// Set the current status message
+	public function status($txt) {
+		$db = DB::getInstance();
+		$db->update("job", $this->_jobid, [
+			"status" => substr($txt, 0, 200)
+		]);
+		if (is_terminal()) {
+			print("  => " . $txt . "\n");
+		}
+	}
+
+	// Mark the job as completed successfully
+	public function finish() {
+		$db = DB::getInstance();
+		$db->update("job", $this->_jobid, [
+			"finished" => time(),
+		]);
+	}
+
+	// Mark the job as failed miserably
+	public function fail($message = "") {
+		$db = DB::getInstance();
+		if ($message != "") {
+			$db->update("job", $this->_jobid, [
+				"status" => substr($message, 0, 200),
+				"failed" => time(),
+			]);
+		} else {
+			$db->update("job", $this->_jobid, [
+				"failed" => time(),
+			]);
+		}
+	}
+
+	// Restart the job.
+	public function retry($msg = "", $when = -1) {
+		if ($when == -1) {
+			$when = rand(60, 600);
+		}
+		$db = DB::getInstance();
+		$status = "Retrying " . date("Y-m-d H:i", time() + $when);
+		if ($msg != "") {
+			$status .= " ($msg)";
+		}
+
+		$db->update("job", $this->_jobid, [
+			"failed" => 0,
+			"finished" => 0,
+			"started" => 0,
+			"status" => $status,
+			"retry" => time() + $when
+		]);
+	}
+
+	// Restart the job and defer it to a later time.
+	public function defer($when) {
+		$db = DB::getInstance();
+		$db->update("job", $this->_jobid, [
+			"failed" => 0,
+			"finished" => 0,
+			"started" => 0,
+			"queued" => $when,
+			"status" => "Deferred until " . gmdate("Y-m-d\TH:i:s\Z", $when)
+		]);
+	}
+		
+	// Look for the next available job that optionally has 
+	// the requested class. Mark it as started, deserialize
+	// it, and return the job runner object.
+	// Returns false if no job available.
+	public static function consumeNextJob($class = null) {
+		$db = DB::getInstance();
+
+		$db->query("lock table job write");
+		if ($class == null) {
+			$q = $db->query("select * from job where started=0 and (retry=0 or retry < unix_timestamp(now())) and queued < unix_timestamp(now()) order by queued limit 1");
+		} else {
+			$q = $db->query("select * from job where started=0 and (retry=0 or retry < unix_timestamp(now())) and queued < unix_timestamp(now()) and class=:class order by queued limit 1", ["class" => $class]);
+		}
+		$r = $db->nextRecord($q);
+		if (!$r) {
+			$db->query("unlock tables");
+			return false;
+		} 
+
+		$db->update("job", $r->id, [
+			"started" => time()
+		]);
+		$db->query("unlock tables");
+
+		$ob = unserialize($r->data);
+		$ob->setJobID($r->id);
+		$ob->setOwner($r->owner);
+		return $ob;
+	}
+
+	public function getOwner() {
+		return $this->_owner;
+	}
+
+	public function setOwner($owner) {
+		$this->_owner = $owner;
+	}
+}
diff --git a/lib/Model.php b/lib/Model.php
new file mode 100755
index 0000000..517a0bd
--- /dev/null
+++ b/lib/Model.php
@@ -0,0 +1,501 @@
+_valid = false;
+		if ($id !== null) {
+			$this->_load_record($id);
+			$this->_loaded = $this->_valid;
+		} else {
+			$this->_get_fields();
+			$this->_loaded = false;
+			$this->_valid = true;
+		}
+	}
+
+	public static function cache_connect($host, $port, $weight = 50) {
+		if (Model::$_cache === null) {
+			Model::$_cache = new Memcached();
+		}
+		Model::$_cache->addServer($host, $port, $weight);
+	}
+
+	private function _load_record($id) {
+
+		$class = get_called_class();
+		if (property_exists($class, "table")) {
+			$v = get_class_vars($class);
+			$table = $v["table"];
+		} else {
+			$table = strtolower($class);
+		}
+
+		$r = DB::getInstance()->select($table, $id);
+
+		if ($r === false) {
+			$this->_valid = false;
+			return;
+		}
+
+
+		foreach ($r as $k=>$v) {
+			$this->_fields[] = $k;
+			$this->_virgin[$k] = $v;
+		}
+
+		if (property_exists($class, "transform")) {
+			foreach ($this->_fields as $k) {
+				if (array_key_exists($k, $this->transform)) {
+					$v = $this->transform[$k];
+					$f = "from_" . $v;
+					if (method_exists($this, $f)) {
+						$this->_data[$k] = $this->$f($this->_virgin[$k]);
+					} else {
+						$this->_data[$k] = $this->_virgin[$k];
+					}
+				} else {
+					$this->_data[$k] = $this->_virgin[$k];
+				}
+			}
+		} else {
+			foreach ($this->_fields as $k) {
+				$this->_data[$k] = $this->_virgin[$k];
+			}
+		}
+		$this->_valid = true;
+	}
+
+	public static function find($where = []) {
+		$class = get_called_class();
+		if (property_exists($class, "table")) {
+			$v = get_class_vars($class);
+			$table = $v["table"];
+		} else {
+			$table = strtolower($class);
+		}
+		return new Query($class, $table, $where);
+	}
+
+
+	private function _get_fields() {
+		$class = get_called_class();
+		if ($class == "Model") { // Light model being used for xfer
+			return;
+		}
+		if (property_exists($class, "table")) {
+			$v = get_class_vars($class);
+			$table = $v["table"];
+		} else {
+			$table = strtolower($class);
+		}
+
+		$this->_fields = [];
+
+		$q = DB::getInstance()->query("describe `" . $table . "`");
+		while ($r = DB::getInstance()->nextRecord($q)) {
+			$this->_fields[] = $r->Field;
+			$this->_data[$r->Field] = null;
+		}
+		$this->_valid = true;
+	}
+
+	public function from_json($data) {
+		if ($data) {
+			$d = json_decode($data);
+			if ($d) return $d;
+		}
+		return new stdClass;
+	}
+
+	public function to_json($data) {
+		return json_encode($data);
+	}
+
+	public function valid() {
+		return $this->_valid;
+	}
+
+	public function loaded() {
+		return $this->_loaded;
+	}
+
+	public function save() {
+		Model::raw_on();
+		$class = get_called_class();
+		if (property_exists($class, "table")) {
+			$v = get_class_vars($class);
+			$table = $v["table"];
+		} else {
+			$table = strtolower($class);
+		}
+
+		$_save = [];
+
+		if (property_exists($class, "transform")) {
+			foreach ($this->_fields as $k) {
+				if (array_key_exists($k, $this->transform)) {
+					$v = $this->transform[$k];
+					$f = "to_" . $v;
+					if (method_exists($this, $f)) {
+						$_save[$k] = $this->$f(@$this->$k);
+					} else {
+						$v = __unref($this->$k);
+						if (is_string($v)) $v = trim($v);
+						$_save[$k] = $v;
+					}
+				} else {
+					$v = __unref($this->$k);
+					if (is_string($v)) $v = trim($v);
+					$_save[$k] = $v;
+				}
+			}
+		} else {
+			foreach ($this->_fields as $k) {
+				$v = __unref($this->$k);
+				if (is_string($v)) $v = trim($v);
+				$_save[$k] = $v;
+			}
+		}
+
+		$_update = [];
+
+		foreach ($_save as $k=>$v) {
+			if (array_key_exists($k, $this->_virgin)) {
+				if ($_save[$k] != $this->_virgin[$k]) {
+					$_update[$k] = $v;
+					$this->_virgin[$k] = $v;
+				}
+			} else {
+				$_update[$k] = $v;
+				$this->_virgin[$k] = $v;
+			}
+		}
+
+		$triggers = [];
+		if ($this->_loaded) {
+			if (count($_update) > 0) {
+				if (in_array("updated", $this->_fields)) {
+					$_update['updated'] = time();
+				}
+	
+				DB::getInstance()->update($table, $this->id, $_update);
+			}
+		} else {
+			$_update = $this->_virgin;
+			if (in_array("created", $this->_fields)) {
+				$_update['created'] = time();
+			}
+			$this->id = DB::getInstance()->insert($table, $_update);
+			$this->_loaded = true;
+		}
+
+		foreach ($_update as $k=>$v) {
+			if (property_exists($class, "_triggers")) {
+				if (array_key_exists($k, $this->_triggers)) {
+					$triggers[$this->_triggers[$k]] = 1;
+				}
+			}
+		}
+
+		foreach ($triggers as $trigger=>$count) {
+
+                        if ($trigger instanceof \Closure) {
+				$trigger->call($this);
+				continue;
+                        }
+
+                        if (is_array($trigger)) {
+                                $c = $trigger[0];
+                                $f = $trigger[1];
+                                $c::$f();
+				continue;
+                        }
+
+			if (is_string($trigger)) {
+				$this->$trigger();
+				continue;
+			}
+		}
+
+		Model::raw_off();
+
+	}
+
+	public static function raw_on() {
+		Model::$_raw = true;
+	}
+
+	public static function raw_off() {
+		Model::$_raw = false;
+	}
+
+	static public function raw() {
+		return Model::$_raw;
+	}
+
+
+	public function delete() {
+        $class = get_called_class();
+        if (property_exists($class, "table")) {
+            $v = get_class_vars($class);
+            $table = $v["table"];
+        } else {
+            $table = strtolower($class);
+        }		
+
+		if (method_exists($this, "on_delete")) {
+			$this->on_delete();
+		}
+
+		DB::getInstance()->query("delete from `" . $table . "` where id=:id", ["id" => $this->_data["id"]]);
+	}
+
+
+	public function __toString() {
+		return "" . $this->_data["id"];
+	}
+
+	public function __toInt() {
+		return (int)$this->_data["id"];
+	}
+
+	public function jsonSerialize() : mixed {
+		
+		$out = [];
+	
+		foreach ($this->_fields as $f) {
+			$out[$f] = $this->_data["$f"];
+		}
+
+		foreach ($this->_fields as $f) {
+			if (array_key_exists($f, $this->_objects)) {
+				$out[$f] = $this->_objects["$f"];
+			}
+		}
+
+		if (property_exists($this, "_computed")) {
+			foreach ($this->_computed as $k=>$v) {
+				$out[$k] = $this->$v();
+			}
+		}
+
+		return $out;
+	}
+
+	private function __get_field_class($f) {
+		if (!property_exists($this, "_classes")) return null;
+		if (!array_key_exists($f, $this->_classes)) return null;
+		return $this->_classes[$f];
+	}
+
+	public function __get($k) {
+		if (property_exists($this, "_computed")) {
+			if (array_key_exists($k, $this->_computed)) {
+
+				$c = $this->cache_get($k);
+				if ($c) return $c;
+
+				$func = $this->_computed[$k];
+				$c = $this->$func();
+				$this->cache_set($k, $c);
+				return $c;
+			}
+		}
+
+
+		if (!in_array($k, $this->_fields)) {
+			return null;
+		}
+
+		$class = $this->__get_field_class($k);
+		if ($class != null) {
+			if (array_key_exists($k, $this->_objects)) return $this->_objects[$k];
+		}
+		return $this->_data[$k];
+	}
+
+	public function __set($key, $val) {
+		if (!in_array($key, $this->_fields)) return false;
+		$class = $this->__get_field_class($key);
+
+		if ($class != null) {
+			if ($val instanceof Model) {
+
+				if ($val instanceof $class) {
+					$this->_data[$val] = $val->id;
+					$this->_objects[$key] = $val;
+					return true;
+				}
+			
+				throw new Exception('Class mismatch');
+				return false;
+			}
+
+			if (is_numeric($val)) {
+				$this->_data[$key] = $val;
+				$this->_objects[$key] = new $class($val);
+				return true;
+			}
+
+			$val = (int)$val;
+			$this->_data[$key] = $val;
+			$this->_objects[$key] = new $class($val);
+			return true;
+		}
+
+		$this->_data[$key] = $val;
+		unset($this->_objects[$key]);
+		return true;
+	}
+
+	public function __isset($key) {
+		if (!in_array($key, $this->_fields)) return false;
+		return true;
+	}
+
+	public function __unset($key) {
+		if (!in_array($key, $this->_fields)) return;
+		$this->_data[$key] = null;
+		unset($this->_objects[$key]);
+	}
+
+	public function load($key = null) {
+
+		if ($key === null) {
+			foreach ($this->_fields as $key) {
+				$this->load($key);
+			}
+			return true;
+		}
+		if (!in_array($key, $this->_fields)) {
+			return false;
+		}
+		$class = $this->__get_field_class($key);
+		if ($class == null) {
+			return false;
+		}
+
+		if ($this->_data[$key] === null) {
+			return false;
+		}
+
+		$ob = new $class($this->_data[$key]);
+		if (!$ob->valid()) return false;
+		$this->_objects[$key] = $ob;
+		return true;
+	}
+
+	private function cache_key($key) {
+		$class = get_called_class();
+		return sprintf("%s[%d]::%s", $class, $this->id, $key);
+	}
+		
+	public function cache_set($key, $val) {
+		$key = $this->cache_key($key);
+		Model::$_cache->set($key, $val, $this->_timeout);
+	}
+
+	public function cache_get($key) {
+		$key = $this->cache_key($key);
+		return Model::$_cache->get($key);
+	}
+
+	public function cache_invalidate($key) {
+		$key = $this->cache_key($key);
+		Model::$_cache->delete($key);
+		
+	}
+	
+	public static function get_all_models() {
+		$res = [];
+		foreach (get_declared_classes() as $class) {
+			if (is_subclass_of($class, "Model")) {
+				$res[] = $class;
+			}
+		}
+	}
+
+	public function create_or_update_table() {
+		
+	}
+
+	public function get_table_name() {
+        $class = get_called_class();
+        if (property_exists($class, "table")) {
+            $v = get_class_vars($class);
+            return($v["table"]);
+        }
+		return (strtolower($class));
+	}
+
+	public function last_modified() {
+		if ($this->updated > 0) {
+			return date("Y-m-d H:i:s", $this->updated);
+		} else {
+			return date("Y-m-d H:i:s", $this->created);
+		}
+	}
+
+}
diff --git a/lib/PDF.php b/lib/PDF.php
new file mode 100755
index 0000000..0379200
--- /dev/null
+++ b/lib/PDF.php
@@ -0,0 +1,165 @@
+arg("-density"); $p->arg($dpi);
+		$p->arg(sprintf("%s[%d]", $this->path(), $page));
+		$p->arg("-alpha"); $p->arg("remove");
+		$p->arg($file);
+
+		$rv = $p->execute();
+
+		if ($rv != 0) {
+			$img = new Image(640, 640);
+
+			$y = 40;
+			$x = 10;
+
+			$b = $img->color(255,255,255);
+			$f = $img->color(0, 0, 0);
+			$img->clear($b);
+
+			$e = implode("\n", $p->stderr());
+			$e = wordwrap($e, 80);
+			$e = explode("\n", $e);
+			
+			foreach ($e as $l) {
+				$img->text($x, $y, $l, $f, 3);
+				$y += 20;
+			}
+
+			$img->save($file, "image/jpeg");
+			return $img;
+
+		}
+
+		return new Image($file);
+	}
+
+	public function force_download() {
+		$this->_force_download = true;
+	}
+
+	public function fake_filename($f) {
+		$this->_fake_filename = $f;
+	}
+
+	public function emit() {
+
+		$filename = $this->_fake_filename;
+		if ($filename == null) {
+			$filename = $this->basename();
+		}
+
+		if ($this->_force_download) {
+			$this->set_header("Content-Type", "application/octet-stream");
+        	$this->set_header("Cache-Control", "public, max-age=31560000, immutable");
+        	$this->set_header("Content-Disposition", "attachment; filename=\"$filename\"");
+		} else {
+			$this->set_header("Content-Type", "application/pdf");
+        	$this->set_header("Cache-Control", "public, max-age=31560000, immutable");
+        	$this->set_header("Content-Disposition", "inline; filename=\"$filename\"");
+		}
+
+		parent::emit();
+	}
+
+
+	public function info() {
+		$infolines = array();
+		$info = array();
+		$proc = new Process("pdfinfo");
+		$proc->arg($this->path());
+		$proc->execute();
+
+		$infolines = $proc->stdout();
+		foreach ($infolines as $line) {
+			if (preg_match('/^([^:]+):\s+(.*)$/', $line, $m)) {
+				$info[$m[1]] = $m[2];
+			}
+		}
+		return $info;
+	}
+
+
+	public function geminiOverview($prods = null, $verbose=false) {
+		$g = new Gemini();
+		$g->verbose = $verbose;
+		try {
+			return $g->geminiOverview($this, $prods);
+		} catch (Exception $e) {
+			throw $e;
+		}
+	}
+
+	public function recompress($dest, $size=PDF_SCREEN) {
+		$proc = new Process("gs");
+
+		$proc->arg("-sDEVICE=pdfwrite");
+		$proc->arg("-dCompatibilityLevel=1.6");
+		switch ($size) {	
+			case PDF_SCREEN:
+				$proc->arg("-dPDFSETTINGS=/screen");
+				break;
+			case PDF_EBOOK:
+				$proc->arg("-dPDFSETTINGS=/ebook");
+				break;
+			case PDF_PRINT:
+				$proc->arg("-dPDFSETTINGS=/printer");
+				break;
+			case PDF_PREPRESS:
+				$proc->arg("-dPDFSETTINGS=/prepress");
+				break;
+		}
+		$proc->arg("-dNOPAUSE");
+		$proc->arg("-dQUIET");
+		$proc->arg("-dBATCH");
+		$proc->arg("-sOutputFile=" . $dest);
+		$proc->arg($this->path());
+		$rv = $proc->execute();
+
+		if ($rv == 0) {
+			return new PDF($dest);
+		}
+		return false;
+	}
+
+	public function ocr(File $out) {
+		$proc = new Process("ocrmypdf");
+		$proc->arg($this->path());
+		$proc->arg($out->path());
+		$proc->execute();
+	}
+
+	public function text() {
+		$proc = new Process("pdftotext");
+#		$proc->arg("-layout");
+		$proc->arg("-enc");
+		$proc->arg("ASCII7");
+		$proc->arg($this->path());
+		$proc->arg("-");
+		$proc->execute();
+
+		$text = new Text(implode("\n", $proc->stdout()));
+		return $text;
+	}
+}
diff --git a/lib/Process.php b/lib/Process.php
new file mode 100755
index 0000000..e344b56
--- /dev/null
+++ b/lib/Process.php
@@ -0,0 +1,82 @@
+_command = $command;
+		$this->_env = $_ENV;
+	}
+
+	public function arg($v) {
+		$this->_args[] = $v;
+	}
+
+	public function env($k, $v) {
+		$this->_env[$k] = $v;
+	}
+
+	public function cwd($p) {
+		$this->_cwd = $p;
+	}
+
+	public function execute() {
+		$command = [];
+		$command[] = escapeshellcmd($this->_command);
+		foreach ($this->_args as $a) {
+			$command[] = escapeshellarg($a);
+		}
+
+		$desc = [
+			["pipe", "r"],
+			["pipe", "w"],
+			["pipe", "w"]
+		];
+
+		$this->_fd = proc_open(
+			implode(" ", $command),
+			$desc,
+			$this->_pipes,
+			$this->_cwd,
+			$this->_env
+		);
+
+		fclose($this->_pipes[0]); // stdin
+
+		$this->_status = proc_get_status($this->_fd);
+		while ($this->_status["running"]) {
+
+			$this->_stdout[] = stream_get_contents($this->_pipes[1]);
+			$this->_stderr[] = stream_get_contents($this->_pipes[2]);
+
+			$this->_status = proc_get_status($this->_fd);
+		}
+			
+		proc_close($this->_fd);
+
+		return $this->_status["exitcode"];
+	}
+
+
+	public function stdout() {
+		return explode("\n", implode("", $this->_stdout));
+	}
+
+	public function stderr() {
+		return explode("\n", implode("", $this->_stderr));
+	}
+
+
+}
diff --git a/lib/Query.php b/lib/Query.php
new file mode 100755
index 0000000..01624c7
--- /dev/null
+++ b/lib/Query.php
@@ -0,0 +1,112 @@
+where = $where;
+		$this->table = $table;
+		$this->class = $class;
+	}
+
+	public function where($where) {
+		foreach ($where as $w) {
+			$this->where[] = $w;
+		}
+		return $this;
+	}
+
+	public function orderBy($order) {
+		$this->order[] = $order;
+		return $this;
+	}
+
+	public function orderByDesc($order) {
+		$this->order[] = "$order desc";
+		return $this;
+	}
+
+	public function limit($a, $b=null) {
+		if ($b == null) {
+			$this->limit = $a;
+		} else {
+			$this->limit = "$a,$b";
+		}
+		return $this;
+	}
+
+	function all() {
+		$this->__run();
+		$cl = $this->class;
+
+		$out = new Collection;
+		while ($r = DB::getInstance()->nextRecord($this->query)) {
+			$ob = new $cl($r->id);
+			$out->push($ob);
+		}
+		return $out;
+	}
+
+	function first() {
+		$this->__run();
+		$cl = $this->class;
+
+		$out = new Collection;
+		if ($r = DB::getInstance()->nextRecord($this->query)) {
+			$ob = new $cl($r->id);
+			return $ob;
+		}
+		return false;
+	}
+
+	function next() {
+		$cl = $this->class;
+
+		$out = new Collection;
+		if ($r = DB::getInstance()->nextRecord($this->query)) {
+			$ob = new $cl($r->id);
+			return $ob;
+		}
+		return false;
+	}
+
+	// Run the query but don't retrieve anything.
+	private function __run() {
+		$args = [];
+		$ac = 1;
+		$q = "select id from `" . $this->table . "`";
+
+		if (count($this->where) > 0) {
+			$q .= " where";
+			
+			$first = true;
+			foreach ($this->where as $w) {
+				if (!$first) {
+					$q .= " and";
+				}
+				$q .= sprintf(" `%s` %s :arg%d", $w[0], $w[1], $ac);
+				$args["arg" . $ac] = $w[2];
+				$first = false;
+				$ac++;
+			}
+		}
+
+		if (count($this->order) > 0) {
+			$q .= " order by ";
+			$q .= implode(",", $this->order);
+		}
+
+		if ($this->limit != "") {
+			$q .= sprintf(" limit %s", $this->limit);
+		}
+
+		$this->query = DB::getInstance()->query($q, $args);
+	}
+}
diff --git a/lib/Request.php b/lib/Request.php
new file mode 100755
index 0000000..b06bbc2
--- /dev/null
+++ b/lib/Request.php
@@ -0,0 +1,112 @@
+get = $_GET;
+		$this->post = $_POST;
+		$this->files = $_FILES;
+		$this->type = strtoupper($_SERVER['REQUEST_METHOD']);
+		$this->peer = $_SERVER['REMOTE_ADDR'];
+		if (array_key_exists("REDIRECT_URL", $_SERVER)) {
+			$this->path = $_SERVER['REDIRECT_URL'];
+		} else {
+			$this->path = "/";
+		}
+
+		if ($this->type == "PUT") {
+			$data = file_get_contents("php://input");
+			$arr = [];
+			parse_str($data, $arr);
+			foreach ($arr as $k=>$v) {
+				$this->put[$k] = $v;
+			}
+		}
+
+		foreach ($_SERVER as $k=>$v) {
+			if (str_starts_with($k, "HTTP_")) {
+				$header = substr($k, 5);
+				$header = strtolower($header);
+				$header = str_replace("_", " ", $header);
+				$header = ucwords($header);
+				$header = str_replace(" ", "-", $header);
+				$this->headers[$header] = $v;
+			}
+		}
+
+		if (array_key_exists("HTTP_REFERER", $_SERVER)) {
+			$this->referer = $_SERVER['HTTP_REFERER'];
+		} else {
+			$this->referer = "";
+		}
+	}
+
+	public function type() {
+		return $this->type;
+	}
+
+	public function headers() {
+		return $this->headers;
+	}
+
+	public function header($h) {
+		if (array_key_exists($h, $this->headers)) {
+			return $this->headers[$h];
+		}
+		return false;
+	}
+
+	public function file($name, $num = false) {
+		if ($num === false) {
+			return $this->files[$name];
+		}
+		if ($num >= count($this->files[$name]["name"])) {
+			return false;
+		}
+		return [
+			"name" => $this->files[$name]["name"][$num],
+			"full_path" => $this->files[$name]["full_path"][$num],
+			"type" => $this->files[$name]["type"][$num],
+			"tmp_name" => $this->files[$name]["tmp_name"][$num],
+			"error" => $this->files[$name]["error"][$num],
+			"size" => $this->files[$name]["size"][$num],
+		];
+	}
+
+	public function get($k) {
+		if (!array_key_exists($k, $this->get)) return false;
+		return $this->get[$k];
+	}
+
+	public function post($k) {
+		if (!array_key_exists($k, $this->post)) return false;
+		return $this->post[$k];
+	}
+
+	public function put($k) {
+		if (!array_key_exists($k, $this->put)) return false;
+		return $this->put[$k];
+	}
+
+	public function set_route($r) {
+		$this->route = $r;
+	}
+
+	public function route() {
+		return $this->route;
+	}
+
+	public function path() {
+		return $this->path;
+	}
+}
diff --git a/lib/Route.php b/lib/Route.php
new file mode 100755
index 0000000..738bd6f
--- /dev/null
+++ b/lib/Route.php
@@ -0,0 +1,112 @@
+method = $m;
+		$this->pattern = $p;
+		$this->function = $f;
+		$this->auth = $a;
+	}
+
+	function matches($m, $path) {
+
+		if ($this->auth != false) {
+	
+			if ($this->auth instanceof \Closure) {
+				if (!$this->auth->call($this)) {
+					return false;
+				}
+			}
+
+			if (is_array($this->auth)) {
+				$c = $this->auth[0];
+				$f = $this->auth[1];
+				if (!$c::$f()) {
+					return false;
+				}
+			}
+
+		}
+
+		if (strtolower($m) != strtolower($this->method)) return false;
+		$src_parts = explode("/", $path);
+		$dst_parts = explode("/", $this->pattern);
+
+		if (count($src_parts) != count($dst_parts)) {
+			return false;
+		}
+
+		$this->args = [];
+		for ($i = 0; $i < count($src_parts); $i++) {
+			$sp = $src_parts[$i];
+			$dp = $dst_parts[$i];
+			if (preg_match('/^{(.*)}$/', $dp, $m)) {
+				$this->args[$m[1]] = $sp;
+				continue;
+			}
+			if ($sp != $dp) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	function get_args() {
+		return $this->args;
+	}
+
+	function call($req) {
+		Route::$current = $this;
+		if ($this->function instanceof \Closure) {
+
+//			$fargs = func_get_args($this->function);
+//			if (in_array("_request", $fargs)) {
+//				$this->args["_request"] = $req;
+//			}
+
+			$ref = new ReflectionFunction($this->function);
+			foreach ($ref->getParameters() as $arg) {
+				if ($arg->name == "_request") {
+					$this->args["_request"] = $req;
+				}
+			}
+
+			return $this->function->call($this, ...$this->args);
+		}
+
+		if (is_array($this->function)) {
+			$c = $this->function[0];
+			$f = $this->function[1];
+			$ref = new ReflectionMethod($c, $f);
+			foreach ($ref->getParameters() as $arg) {
+				if ($arg->name == "_request") {
+					$this->args["_request"] = $req;
+				}
+			}
+			
+
+			return $c::$f(...$this->args);
+		}
+
+		return [404, "Not Found"];
+	}
+
+	public static function canonical() {
+		$c = Route::$current;
+		if (!$c->path) {
+			return Config::get("URL");
+		}
+		$bits = parse_url($c->path);
+		return Config::get("URL") . $bits["path"];
+	}
+
+}
diff --git a/lib/Routes.php b/lib/Routes.php
new file mode 100755
index 0000000..84c573f
--- /dev/null
+++ b/lib/Routes.php
@@ -0,0 +1,37 @@
+matches($m, $path)) {
+				return $route;
+			}
+		}
+		return false;
+	}
+
+	static function find_web($m, $path) {
+		foreach (Routes::$web as $route) {
+			if ($route->matches($m, $path)) {
+				
+				$route->path = $path;
+				return $route;
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/lib/Session.php b/lib/Session.php
new file mode 100755
index 0000000..9e31419
--- /dev/null
+++ b/lib/Session.php
@@ -0,0 +1,71 @@
+addServer($host, $port, $weight);
+	}
+
+	public static function get(string $key) : mixed {
+		$sid = Session::getID();
+
+		$key = "Session::" . $sid . "::" . $key;
+
+		$t = Session::$cache->get($key);
+		if ($t) {
+			return unserialize($t);
+		} else {
+			return false;
+		}
+	}	
+
+	public static function set(string $key, mixed $value) : void {
+		$sid = Session::getID();
+		$fkey = "Session::" . $sid . "::" . $key;
+		Session::$cache->set($fkey, serialize($value));//, 60*60*24*30);
+	}
+
+	public static function unset(string $key) : void {
+		$sid = Session::getID();
+		$fkey = "Session::" . $sid . "::" . $key;
+		Session::$cache->delete($fkey);
+	}
+
+	public static function all_data() {
+        	$sid = Session::getID();
+		$fkey = "Session::" . $sid . "::";
+		$keys = Session::$cache->getAllKeys();
+        	$data = [];
+		foreach ($keys as $k) {
+			if (str_starts_with($k, $fkey)) {
+				$d = Session::get($k);
+				if (!$d) {
+					$d = [];
+            			}		
+				$out[$k] = $data;
+			}
+        	}
+		return $out;
+	}
+}
diff --git a/lib/Text.php b/lib/Text.php
new file mode 100644
index 0000000..dee9480
--- /dev/null
+++ b/lib/Text.php
@@ -0,0 +1,39 @@
+text = $this->cleanup($text);
+	}
+
+	function cleanup($text) {
+        $text = str_replace("", " ", $text);
+        $text = str_replace("\t", " ", $text);
+        $text = str_replace("\r", " ", $text);
+        $text = str_replace("\n", " ", $text);
+        $text = str_replace("\"", "", $text);
+        $text = str_replace(",", " ", $text);
+        $text = str_replace("–", "-", $text);
+        $text = str_replace("—", "-", $text);
+        $text = str_replace("Ø", "0", $text);
+        $text = str_replace("~", "-", $text);
+        $text = str_replace("--", "-", $text);
+		$text = preg_replace('/\s\s+/', ' ', $text);
+		return trim($text);
+	}
+
+	public function get_text() {
+		return $this->text;
+	}
+
+	public function words() {
+        $text = preg_replace('/([^A-Z\-0-9]+)/', ' ', strtoupper($this->text));
+        $words = preg_split('/\s+/', $text);
+        return $words;
+	}
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3e41fee
--- /dev/null
+++ b/package.json
@@ -0,0 +1,21 @@
+{
+  "dependencies": {
+    "@fortawesome/fontawesome-free": "^6.7.2",
+    "bootstrap": "^5.3.7",
+    "css-loader": "^7.1.2",
+    "expose-loader": "^5.0.1",
+    "jquery": "^3.7.1",
+    "jquery-simple-websocket": "github:jbloemendal/jquery-simple-websocket",
+    "js-image-zoom": "^0.7.0",
+    "marked": "^16.1.1",
+    "mini-css-extract-plugin": "^2.9.2",
+    "popper.js": "^1.16.1",
+    "style-loader": "^4.0.0",
+    "vue": "^3.5.17",
+    "vue-loader": "^17.4.2",
+    "webpack": "^5.99.9"
+  },
+  "devDependencies": {
+    "webpack-cli": "^6.0.1"
+  }
+}
diff --git a/public/d192.png b/public/d192.png
new file mode 100644
index 0000000000000000000000000000000000000000..f325bc39db4a57d794f2ccccdff78ce29332880a
GIT binary patch
literal 2483
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
O&=u|LS_K#HJp2!0#$vkw

literal 0
HcmV?d00001

diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..8e585931ac23c70799bcdcfbe585e6160cdb9fee
GIT binary patch
literal 5798
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

gy@iyYoc0VaeStmaHruSFWe0@~=rV4U3^ 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%0AGwZ`o2JP(Y7_A`ck8Bf>;*MnzD$?|EPD`v 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"); + print_r($_request); + exit(0); +}); + + +Routes::add_web("GET", "/privacy", function() { return blade("privacy"); }); + + +Routes::add_web("GET", "/wordpress/wp-admin/setup-config.php", ["AntiSpam", "tarpit"]); +Routes::add_web("GET", "/wp-admin/setup-config.php", ["AntiSpam", "tarpit"]); + +Routes::add_web("HEAD", "/", function() { return "OK"; }); + + +Routes::add_web("GET", "/document/{id}/metadata/{metadata}/delete", ["DocumentController", "delete_metadata"], ["Auth", "can_moderate"]); + +Routes::add_web("GET", "/delete/revision/{id}", ["RevisionController", "delete"], ["Auth", "can_moderate"]); + +Routes::add_web("GET", "/redownload/revision/{id}", ["RevisionController", "redownload"], ["Auth", "can_moderate"]); + + +Routes::add_web("GET", "/purge/revision/{id}", ["RevisionController", "purge"], ["Auth", "can_moderate"]); + +Routes::add_web("GET", "/attachment/{id}/{filename}", ["DocumentController", "download_attachment"]); + +Routes::add_web("GET", "/upload", ["DocumentController", "upload_document"], ["Auth", "can_upload"]); +Routes::add_web("POST", "/upload", ["DocumentController", "do_upload_document"], ["Auth", "can_upload"]); +Routes::add_web("GET", "/upload/attachment/{id}", ["DocumentController", "upload_attachment"], ["Auth", "can_upload"]); +Routes::add_web("POST", "/upload/attachment/{id}", ["DocumentController", "do_upload_attachment"], ["Auth", "can_upload"]); + +Routes::add_web("GET", "/uploads", ["DocumentController", "uploads"], ["Auth", "can_upload"]); +Routes::add_web("GET", "/uploads/import/{id}/{source}", ["DocumentController", "import"], ["Auth", "can_upload"]); +Routes::add_web("GET", "/uploads/duplicate/{id}", ["DocumentController", "upload_duplicate"], ["Auth", "can_upload"]); +Routes::add_web("GET", "/uploads/rerunall", ["DocumentController", "rerun_all"], ["Auth", "can_upload"]); +Routes::add_web("GET", "/uploads/rerun/{id}", ["DocumentController", "rerun_upload"], ["Auth", "can_upload"]); +Routes::add_web("GET", "/uploads/discard/{id}", ["DocumentController", "discard_upload"], ["Auth", "can_upload"]); + +Routes::add_web("GET", "/uploads/{page}", ["DocumentController", "uploads_page"], ["Auth", "can_upload"]); + + + +Routes::add_web("GET", "/generate/sitemap.xml", ["SitemapController", "generate"]); + + +Routes::add_web("GET", "/recompress/revision/{id}", ["RevisionController", "recompress"], ["Auth", "can_moderate"]); + +Routes::add_web("GET", "/ocr/revision/{id}", ["RevisionController", "ocr"], ["Auth", "can_moderate"]); + +Routes::add_web("GET", "/uploads/view/{id}", ["DocumentController", "view_upload"], ["Auth", "can_upload"]); + + + +Routes::add_web("GET", "/document/unfavourite/{doc}", ["FavouriteController", "user_unset_favourite"], ["Auth", "logged_in"]); +Routes::add_web("GET", "/document/favourite/{doc}", ["FavouriteController", "user_set_favourite"], ["Auth", "logged_in"]); +Routes::add_web("GET", "/favourites", ["FavouriteController", "favourites"], ["Auth", "logged_in"]); + + +Routes::add_web("GET", "/systems", ["SystemController", "systems"], ["Auth", "logged_in"]); +Routes::add_web("GET", "/system/add", ["SystemController", "systems_add"], ["Auth", "logged_in"]); +Routes::add_web("POST", "/system/add", ["SystemController", "systems_do_add"], ["Auth", "logged_in"]); +Routes::add_web("GET", "/system/{id}", ["SystemController", "system"], ["Auth", "logged_in"]); +Routes::add_web("GET", "/system/{id}/add/{doc}", ["SystemController", "system_add_doc"], ["Auth", "logged_in"]); +Routes::add_web("GET", "/system/{id}/del/{doc}", ["SystemController", "system_del_doc"], ["Auth", "logged_in"]); + +Routes::add_web("GET", "/extract/revision/{id}", ["RevisionController", "split_revision"], ["Auth", "can_moderate"]); diff --git a/src/.vue b/src/.vue new file mode 100755 index 0000000..52fe565 --- /dev/null +++ b/src/.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/DDDiv.vue b/src/DDDiv.vue new file mode 100755 index 0000000..5430fa6 --- /dev/null +++ b/src/DDDiv.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/DocumentEdit.vue b/src/DocumentEdit.vue new file mode 100755 index 0000000..2faf477 --- /dev/null +++ b/src/DocumentEdit.vue @@ -0,0 +1,195 @@ + + + diff --git a/src/Download.vue b/src/Download.vue new file mode 100755 index 0000000..fa102f7 --- /dev/null +++ b/src/Download.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/DownloadManager.vue b/src/DownloadManager.vue new file mode 100755 index 0000000..681f6a3 --- /dev/null +++ b/src/DownloadManager.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/IDMatch.vue b/src/IDMatch.vue new file mode 100755 index 0000000..20e1c34 --- /dev/null +++ b/src/IDMatch.vue @@ -0,0 +1,249 @@ + + + diff --git a/src/Imports.vue b/src/Imports.vue new file mode 100755 index 0000000..f0a410d --- /dev/null +++ b/src/Imports.vue @@ -0,0 +1,550 @@ + + + + + diff --git a/src/InlineEdit.vue b/src/InlineEdit.vue new file mode 100755 index 0000000..c603f30 --- /dev/null +++ b/src/InlineEdit.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/InlineEditText.vue b/src/InlineEditText.vue new file mode 100755 index 0000000..bd4f48d --- /dev/null +++ b/src/InlineEditText.vue @@ -0,0 +1,114 @@ + + + diff --git a/src/ItemAdder.vue b/src/ItemAdder.vue new file mode 100644 index 0000000..66ee6c4 --- /dev/null +++ b/src/ItemAdder.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/JobDisplay.vue b/src/JobDisplay.vue new file mode 100755 index 0000000..2d399c0 --- /dev/null +++ b/src/JobDisplay.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/KeyboardInteraction.vue b/src/KeyboardInteraction.vue new file mode 100644 index 0000000..27bee83 --- /dev/null +++ b/src/KeyboardInteraction.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/PDF.vue b/src/PDF.vue new file mode 100755 index 0000000..e5b09b6 --- /dev/null +++ b/src/PDF.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/PDFList.vue b/src/PDFList.vue new file mode 100755 index 0000000..fa33593 --- /dev/null +++ b/src/PDFList.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/ProductControls.vue b/src/ProductControls.vue new file mode 100755 index 0000000..61b7d51 --- /dev/null +++ b/src/ProductControls.vue @@ -0,0 +1,188 @@ + + + diff --git a/src/ProductSelector.vue b/src/ProductSelector.vue new file mode 100755 index 0000000..9d84358 --- /dev/null +++ b/src/ProductSelector.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/Search.vue b/src/Search.vue new file mode 100755 index 0000000..7511aea --- /dev/null +++ b/src/Search.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/SpiderPages.vue b/src/SpiderPages.vue new file mode 100755 index 0000000..06a3f25 --- /dev/null +++ b/src/SpiderPages.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/StarRating.vue b/src/StarRating.vue new file mode 100755 index 0000000..0cf1ced --- /dev/null +++ b/src/StarRating.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/Template.vue b/src/Template.vue new file mode 100755 index 0000000..52fe565 --- /dev/null +++ b/src/Template.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/app.css b/src/app.css new file mode 100755 index 0000000..5f6356f --- /dev/null +++ b/src/app.css @@ -0,0 +1,27 @@ +.table td.fit, +.table th.fit { + white-space: nowrap; + width: 1% +} + +a[title]:hover::after { + padding: 5px; +} + +.ocrtext { + overflow: auto; + max-height: 400px; + +} + +.page-right { + cursor: e-resize; +} + +.page-left { + cursor: w-resize; +} + +.page-end { + cursor: not-allowed; +} diff --git a/src/app.js b/src/app.js new file mode 100755 index 0000000..bf0411f --- /dev/null +++ b/src/app.js @@ -0,0 +1,54 @@ + +import 'jquery'; +import 'jquery-simple-websocket'; +import 'bootstrap'; +import '@fortawesome/fontawesome-free/js/fontawesome'; +import '@fortawesome/fontawesome-free/js/solid'; +import '@fortawesome/fontawesome-free/js/regular'; +import '@fortawesome/fontawesome-free/js/brands'; + +import 'bootstrap/dist/css/bootstrap.min.css'; + +import { createApp } from 'vue/dist/vue.esm-bundler'; + +import Download from './Download.vue'; +import DocumentEdit from './DocumentEdit.vue'; +import ProductSelector from './ProductSelector.vue'; +import ProductControls from './ProductControls.vue'; +import InlineEdit from './InlineEdit.vue'; +import InlineEditText from './InlineEditText.vue'; +import Search from './Search.vue'; +import PDFList from './PDFList.vue'; +import SpiderPages from './SpiderPages.vue'; +import DownloadManager from './DownloadManager.vue'; +import Imports from './Imports.vue'; +import IDMatch from './IDMatch.vue'; +import DDDiv from './DDDiv.vue'; +import PDF from './PDF.vue'; +import ItemAdder from './ItemAdder.vue'; +import KeyboardInteraction from './KeyboardInteraction.vue'; +import JobDisplay from './JobDisplay.vue'; +import StarRating from './StarRating.vue'; + +const app = createApp({ }); + +app.component("download", Download); +app.component("documentedit", DocumentEdit); +app.component("productselector", ProductSelector); +app.component("productcontrols", ProductControls); +app.component("inlineedit", InlineEdit); +app.component("inlineedittext", InlineEditText); +app.component("search", Search); +app.component("pdflist", PDFList); +app.component("spiderpages", SpiderPages); +app.component("downloadmanager", DownloadManager); +app.component("imports", Imports); +app.component("idmatch", IDMatch); +app.component("dddiv", DDDiv); +app.component("pdf", PDF); +app.component("itemadder", ItemAdder); +app.component("keyboardinteraction", KeyboardInteraction); +app.component("jobdisplay", JobDisplay); +app.component("starrating", StarRating); + +$(window).on("load", function() { app.mount('#app') }); diff --git a/src/app.scss b/src/app.scss new file mode 100755 index 0000000..e69de29 diff --git a/views/404.blade.php b/views/404.blade.php new file mode 100644 index 0000000..b7edd70 --- /dev/null +++ b/views/404.blade.php @@ -0,0 +1,8 @@ +@extends("layout.main") +@section("content") +

+@endsection diff --git a/views/account.blade.php b/views/account.blade.php new file mode 100644 index 0000000..0dc207b --- /dev/null +++ b/views/account.blade.php @@ -0,0 +1,94 @@ +@extends("layout.main") +@section("content") + + + +@if ($tab == "account") +
+
+
+
Change Password
+
+
+ Current password + +
+
+ New password + +
+
+ Confirm password + + +
+
+
+
+
+@endif + + + +@if ($tab == "data") + +

Here is a list of all the data associated with your current session.

+ + + + + + + + + + + @foreach ($session as $k=>$v) + + + + + @endforeach + +
KeyData
{{ $k }}{{ json_encode($v) }}
+ +

And here is the contents of your user's database record.

+ + + + + + + + + + + @foreach ($user->_data as $k=>$v) + + + + + @endforeach + +
KeyData
{{ $k }}{{ json_encode($v) }}
+ +

And that's it. That's the sum total of the data we currently store.

+ +@endif + +@endsection diff --git a/views/document.blade.php b/views/document.blade.php new file mode 100644 index 0000000..2ddf95c --- /dev/null +++ b/views/document.blade.php @@ -0,0 +1,165 @@ +@extends("layout.main") +@section("content") +@if (Auth::can_moderate()) + +@endif + +@if (get_user()) +
+
+ +
+
+ +@endif + +

{{ $doc->title }}

+

{{ $doc->subtitle }}

+

{{ $doc->subsubtitle }}

+ +
+
+ @if (Auth::can_moderate()) +
+ + + + + + +
+ @endif +
Order Number: {{ $doc->internal_id }}
+ + @if (Auth::can_moderate()) + + + @foreach ($doc->metadata as $meta) + @php + $meta->load("metadata"); + @endphp + + + + + + @endforeach + +
{{ $meta->metadata->name }} +
+ + @else + + + @foreach ($doc->metadata as $meta) + @php + $meta->load("metadata"); + @endphp + + + + + @endforeach + +
{{ $meta->metadata->name }}{{ $meta->data }}
+ @endif + +
+ @if ($doc->attachments->count() > 0) +
Attachments
+ + + + + + + @foreach ($doc->attachments as $f) + + + + + @endforeach + +
FilenameSize
{{ $f->basename() }}{{ $f->size() }}
+ @endif + + + + @if ($doc->overview) +
+ {!! $doc->overview_md() !!} +
+ @endif +
+ +
+ +
+ @foreach ($doc->revisions as $rev) + @component("thumbnail-50", ["rev" => $rev]) + @endcomponent + @endforeach +
+
+ + + @if (count($doc->related) > 0) +
+
Related Documents
+ + @foreach ($doc->related as $r) + + + + + @endforeach +
+ + {{ $r->title }} + {{ $r->subtitle }} + {{ $r->subsubtitle }} + + + + {{ $r->internal_id }} + +
+
+ @endif +
+ +@endsection diff --git a/views/documents.blade.php b/views/documents.blade.php new file mode 100755 index 0000000..845101f --- /dev/null +++ b/views/documents.blade.php @@ -0,0 +1,140 @@ +@extends("layout.main") +@section("content") +
+ @foreach ($product->get_tree() as $p) + {{ $p->title }} + @endforeach +
+refurl) ?>
+ +@if (Auth::can_moderate()) +{{ $product->overview }} +@else +@if ($product->overview != "") +
+{!! $product->overview_md() !!} +
+@endif +@endif + + + +@if (Auth::can_moderate()) + + + +@endif + + + + + @foreach ($product->meta() as $m) + + @endforeach + + + + +@if ($product->parent != null) + + + @if (Auth::can_moderate()) + + @else + + @endif + +@endif + + +@foreach ($product->children as $child) + + + @if (Auth::can_moderate()) + + @else + + @endif + + +@endforeach + +@foreach ($product->documents_sorted_by_meta() as $doc) + + + + + @foreach ($product->meta() as $m) + + @endforeach + + +@endforeach +
+
+ +
+
Title{{ MetaType::name($m) }}Order No
+ + Parent + + Parent
+ @if ($child->title == "Trash") + + @else + + @endif + + + + {{$child->title}} + + + {{$child->title}}
+ @if ($doc->attachments->count() > 0) + + @else + + @endif + + @if (Auth::can_moderate()) + + + {{$doc->title}} + {{$doc->subtitle}} + {{$doc->subsubtitle}} + @if ($doc->oneliner) +
{{ $doc->oneliner }} + @endif +
+
+ @else + + {{$doc->title}} + {{$doc->subtitle}} + {{$doc->subsubtitle}} + @if ($doc->oneliner) +
{{ $doc->oneliner }} + @endif +
+ @endif + +
+ + {{ $doc->get_metadata_by_id($m) }} + + + + {{ $doc->internal_id }} + +
+ +
+ + + {{ count($product->documents) }} documents + + +
+ +@endsection diff --git a/views/downloads.blade.php b/views/downloads.blade.php new file mode 100644 index 0000000..c3f270f --- /dev/null +++ b/views/downloads.blade.php @@ -0,0 +1,4 @@ +@extends("layout.main") +@section("content") + +@endsection diff --git a/views/favourites.blade.php b/views/favourites.blade.php new file mode 100644 index 0000000..b2cc4c7 --- /dev/null +++ b/views/favourites.blade.php @@ -0,0 +1,16 @@ +@extends("layout.main") +@section("content") +
+ +

Your favourite documens

+
+ + + +@endsection diff --git a/views/forms/input.blade.php b/views/forms/input.blade.php new file mode 100644 index 0000000..c0667ea --- /dev/null +++ b/views/forms/input.blade.php @@ -0,0 +1,4 @@ +
+ + +
diff --git a/views/forms/password.blade.php b/views/forms/password.blade.php new file mode 100644 index 0000000..53ec3bd --- /dev/null +++ b/views/forms/password.blade.php @@ -0,0 +1,4 @@ +
+ + +
diff --git a/views/forms/submit.blade.php b/views/forms/submit.blade.php new file mode 100644 index 0000000..e26dbf5 --- /dev/null +++ b/views/forms/submit.blade.php @@ -0,0 +1,5 @@ +
+ +
+ + diff --git a/views/idmatch.blade.php b/views/idmatch.blade.php new file mode 100644 index 0000000..fd735e8 --- /dev/null +++ b/views/idmatch.blade.php @@ -0,0 +1,4 @@ +@extends("layout.main") +@section("content") + +@endsection diff --git a/views/imports.blade.php b/views/imports.blade.php new file mode 100644 index 0000000..169c3c3 --- /dev/null +++ b/views/imports.blade.php @@ -0,0 +1,4 @@ +@extends("layout.main") +@section("content") + +@endsection diff --git a/views/index.blade.php b/views/index.blade.php new file mode 100644 index 0000000..3cfd796 --- /dev/null +++ b/views/index.blade.php @@ -0,0 +1,46 @@ +@extends('layout.main') +@section('content') +

Welcome to DECPDF, the searchable and organised repository of +Digital Equipment Corporation (DEC) documentation, gathering together documents +and manuals from around the internet and from users' personal archives.

+ +

We have strived to arrange the content of this site in a logical order +so that it finally becomes easy to locate the documentation for your device +or system that you need - be it a PDP-11 computer, or an obscure feature +of VMS. It should all be there at your fingertips.

+ +

Do you have a document that we don't? Are we missing some vital information +that you could provide us with? Then register for an account and request +upload permissions, and you can help us to build the ultimate repository +of DEC documentation.

+ +

FAQ

+ +
Why do some documents have "Original" and "OCR" versions?
+

When a new document is uploaded it is tested to see if it has had OCR run on it +already. If it has, we use that OCR data for our indexing. If it hasn't, we automatically +run OCR on the document. This creates a new version of the document, the OCR version. +We keep the original alongside the new OCR version and give you the choice of which +version to download.

+ +
I have a different copy of a document you already have. Can I upload it?
+

Absolutely. Document revisions with the same main document ID code will be grouped together +within the document on the website. We actively seek out other versions of documents, or +even other scans of existing revisions of documents, to try and make the archive as complete +as possible.

+ +
What's the Order Number and Revision when I upload?
+

The order number is DEC's internal document reference ID. It is typically of the format +XX-YYYYY-ZZ-RRR, for example EK-3K370-TR-001. The first three sections are the document +ID and the last section is the document revision. When you upload please split the document +ID from the revision and enter them into the two separate boxes. That way the different +revisions of the same document are properly grouped together. Note that not all documents +(especially field maintenance print sets) use this format of document IDs, and not all documents +even have an ID. In this case, just enter what you can in the document ID and leave the +revision either empty or set to 000 (which indicates it's the original unrevised version). +If there is no document ID then leave the Order Number blank. A new document ID will be +generated as a placeholder for internal use.

+ +
Will you ever host binary files like disk images and software?
+

No. That opens up a whole other kettle of worms, alongside a can of fish as well.

+@endsection diff --git a/views/layout/main.blade.php b/views/layout/main.blade.php new file mode 100644 index 0000000..9ee3c07 --- /dev/null +++ b/views/layout/main.blade.php @@ -0,0 +1,123 @@ + + + + Digital PDFs + + + + + + + + + +
+ + +
+ @if($flash_error) +
{{ $flash_error }}
+ @endif + + @if($flash_warn) +
{{ $flash_warn }}
+ @endif + + @if($flash_info) +
{{ $flash_info }}
+ @endif + + @if($flash_success) +
{{ $flash_success }}
+ @endif +
+@yield('content') + +
+ +

Site structure and layout ©2026 Majenko Technologies

+ +
+ + + diff --git a/views/loggedin.blade.php b/views/loggedin.blade.php new file mode 100644 index 0000000..7f4ad5b --- /dev/null +++ b/views/loggedin.blade.php @@ -0,0 +1,4 @@ +@extends("layout.main") +@section("content") +

You are now logged in.

+@endsection diff --git a/views/login.blade.php b/views/login.blade.php new file mode 100755 index 0000000..09866fb --- /dev/null +++ b/views/login.blade.php @@ -0,0 +1,19 @@ +@extends("layout.main") +@section("content") +
+
+
+
+
Log In
+
+
+ {!!Form::input("Username or Email", "username", "")!!} + {!!Form::password("Password", "password", "")!!} + {!!Form::submit("Login")!!} +
+
+
+
+
+
+@endsection diff --git a/views/privacy.blade.php b/views/privacy.blade.php new file mode 100644 index 0000000..78c306c --- /dev/null +++ b/views/privacy.blade.php @@ -0,0 +1,23 @@ +@extends("layout.main") +@section("content") +

Privacy and Data

+ +

What cookies do you store?

+

One. Just one cookie. That is all we put on your computer. That cookie is a simple randomly generated session ID.

+ +

What is it used for?

+

It is used to associate temporary runtime information about how you are using the site. Such things as which user ID you are +currently logged into the site as, or what you are currently searching for.

+ +

How long do you keep that information?

+

All information connected to your session is stored in a memcached database. This is a temporary data store which is never +written to disk. The data expires after a month if not used, or if the storage system should get restarted. In other words, it's +ephemeral and we don't store it past holding it in memory.

+ +

What other data do you store about me?

+

Only what you provide when you register for an account - username, email and password (which is hashed so cannot be seen by anyone, ever).

+ +

Will you ever sell or otherwise pass on my data to someone else?

+

No. Absolutely not. Since we don't really store any data of note, there's not really anything to sell, and even if there was we +wouldn't sell it anyway. Selling people's data is just scummy and evil, and we don't want to be scummy and evil.

+@endsection diff --git a/views/register.blade.php b/views/register.blade.php new file mode 100644 index 0000000..2805356 --- /dev/null +++ b/views/register.blade.php @@ -0,0 +1,21 @@ +@extends("layout.main") +@section("content") +
+
+
+
+
Register
+
+
+ {!!Form::input("Username", "username", $username)!!} + {!!Form::input("Email", "email", $email)!!} + {!!Form::password("Password", "password", $password)!!} + {!!Form::password("Password Confirmation", "confirm", $confirm)!!} + {!!Form::submit("Register")!!} +
+
+
+
+
+
+@endsection diff --git a/views/revision.blade.php b/views/revision.blade.php new file mode 100644 index 0000000..98cd56a --- /dev/null +++ b/views/revision.blade.php @@ -0,0 +1,89 @@ +@extends("layout.main") +@section("content") + +@if (Auth::can_moderate()) + +@endif + + + > +
+ @component("thumbnail", ["rev" => $rev]) + @endcomponent + +
+ @if (Auth::can_moderate()) +
+ + + + + + +
+ @endif + + @if ($rev->document) + + + + + + + + + + @endif + + + + + + + + + + + + + + + + +
+ Document: + + + {{ $rev->document->title }} + {{ $rev->document->subtitle }} + {{ $rev->document->subsubtitle }} + +
+ Order Number: + + {{ $rev->document->internal_id }} +
+ Revision: + + @if (Auth::can_moderate()) + + @else + {{ $rev->revno }} + @endif +
+ Pages: + + @isset ($rev->info->Pages) + {{ $rev->info->Pages }} + @else + Unknown + @endisset +
+ Original Filename: + + {{ $rev->origtitle }} +
+ +
+
+@endsection diff --git a/views/search.blade.php b/views/search.blade.php new file mode 100644 index 0000000..065c31e --- /dev/null +++ b/views/search.blade.php @@ -0,0 +1,74 @@ +@extends("layout.main") +@section("content") + + + + + +
+@foreach ($results as $rev) +@if ($rev !== false) +@component("thumbnail_title", ["rev" => $rev]) +@endcomponent +@endif +@endforeach +
+ + + + +@endsection diff --git a/views/simple_table.blade.php b/views/simple_table.blade.php new file mode 100644 index 0000000..ee95e2d --- /dev/null +++ b/views/simple_table.blade.php @@ -0,0 +1,10 @@ + + + @foreach ($list as $k=>$v) + + + + + @endforeach + +
{{ $k }}{{ $v }}
diff --git a/views/sitemap.blade.php b/views/sitemap.blade.php new file mode 100644 index 0000000..d198df4 --- /dev/null +++ b/views/sitemap.blade.php @@ -0,0 +1,20 @@ +<{!! '?xml version="1.0" encoding="UTF-8"?' !!}> + +@foreach ($docs as $doc) + + {{ Config::get("URL") }}/document/{{ $doc->id }} + {{ $doc->last_modified() }} + +@endforeach + +@foreach ($revs as $rev) + + {{ Config::get("URL") }}/revision/{{ $rev->id }} + {{ $rev->last_modified() }} + + + {{ Config::get("URL") }}/pdf/{{ $rev->id }}/download/{{ $rev->filename() }} + {{ $rev->last_modified() }} + +@endforeach + diff --git a/views/spider_pages.blade.php b/views/spider_pages.blade.php new file mode 100644 index 0000000..1b3ae97 --- /dev/null +++ b/views/spider_pages.blade.php @@ -0,0 +1,4 @@ +@extends("layout.main") +@section("content") + +@endsection diff --git a/views/spider_pdfs.blade.php b/views/spider_pdfs.blade.php new file mode 100644 index 0000000..4ff0204 --- /dev/null +++ b/views/spider_pdfs.blade.php @@ -0,0 +1,4 @@ +@extends("layout.main") +@section("content") + +@endsection diff --git a/views/status.blade.php b/views/status.blade.php new file mode 100644 index 0000000..9dbd0bd --- /dev/null +++ b/views/status.blade.php @@ -0,0 +1,27 @@ +@extends("layout.main") +@section("content") + +
+
+

Spider

+ @component("simple_table", ["list" => $spider]); + @endcomponent +
+
+

PDF URLs

+ @component("simple_table", ["list" => $pdf]); + @endcomponent +
+
+

OCR

+ @component("simple_table", ["list" => $ocr]); + @endcomponent +
+
+

Index

+ @component("simple_table", ["list" => $idx]); + @endcomponent +
+
+ +@endsection diff --git a/views/system.blade.php b/views/system.blade.php new file mode 100644 index 0000000..ca49ce6 --- /dev/null +++ b/views/system.blade.php @@ -0,0 +1,32 @@ +@extends("layout.main") +@section("content") +
+ +

{{ $sys->name }}

+

{{ $sys->model }}

+
+

{{ $sys->notes }}

+
+
Documents
+ +@foreach ($sys->documents as $doc) + + + + + + +@endforeach +
+ + {{ $doc->title }} + {{ $doc->subtitle }} + {{ $doc->subsubtitle }} + + + {{ $doc->internal_id }} +
+
+

To add a document to this system first navigate to the document then +click the Add To System button and select this system from the dropdown.

+@endsection diff --git a/views/systems.blade.php b/views/systems.blade.php new file mode 100644 index 0000000..e099648 --- /dev/null +++ b/views/systems.blade.php @@ -0,0 +1,18 @@ +@extends("layout.main") +@section("content") +
+ +

Your systems

+
+ + + + Add a new system + +@endsection diff --git a/views/systems_add.blade.php b/views/systems_add.blade.php new file mode 100644 index 0000000..8cc6f41 --- /dev/null +++ b/views/systems_add.blade.php @@ -0,0 +1,34 @@ +@extends("layout.main") +@section("content") +
+ +

Add system

+

Adding a system allows you to gather together all the documents you need +for working with a specific computer you own, along with all the expansion +cards that are inside that computer.

+
+
+ + +

Give your system a friendly name. I'm sure you've already named all your computers.

+ + + +

What kind of computer is this system?

+ + + +

Add any notes about the system you like here.

+ +
+
+ Cancel + +
+
+ +
+ + +@endsection diff --git a/views/thumbnail-50.blade.php b/views/thumbnail-50.blade.php new file mode 100644 index 0000000..cc9ed57 --- /dev/null +++ b/views/thumbnail-50.blade.php @@ -0,0 +1,95 @@ +@php +$rev->load("document"); +@endphp +
+ + + +
+
+ @if (($rev->revno != "") && ($rev->revno != "0")) +
+ {{ $rev->document->internal_id }}-{{ $rev->revno }} +
+ @else +
+ {{ $rev->document->internal_id }} +
+ @endif +
+
+
+
+ + {{ fmt_date($rev->month, $rev->year) }} + +
+
+ @isset ($rev->info->Pages) + {{ $rev->info->Pages }} pages + @else + Number of pages unknown + @endisset +
+
+
+
+ Quality +
+
+ +
+
+ +
+
+
+
+
+ +
+
+ + Original + +
+
+ {{ format_size(stat($rev->path() . "/doc.pdf")["size"]) }} +
+
+ + @if (file_exists($rev->path() . "/ocr.pdf")) +
+
+
+
+
+
+
+ + OCR Version + +
+
+ {{ format_size(stat($rev->path() . "/ocr.pdf")["size"]) }} +
+
+ + @endif +
+
+
diff --git a/views/thumbnail.blade.php b/views/thumbnail.blade.php new file mode 100644 index 0000000..36c8308 --- /dev/null +++ b/views/thumbnail.blade.php @@ -0,0 +1,97 @@ +@php +$rev->load("document"); +@endphp +
+ + + +
+ @if ($rev->document) +
+ @if (($rev->revno != "") && ($rev->revno != "0")) +
+ {{ $rev->document->internal_id }}-{{ $rev->revno }} +
+ @else +
+ {{ $rev->document->internal_id }} +
+ @endif +
+ @endif +
+
+
+ + {{ fmt_date($rev->month, $rev->year) }} + +
+
+ @isset ($rev->info->Pages) + {{ $rev->info->Pages }} pages + @else + Number of pages unknown + @endisset +
+
+
+
+ Quality +
+
+ +
+
+
+
+
+
+
+
+
+ + Original + +
+
+ {{ format_size(stat($rev->path() . "/doc.pdf")["size"]) }} +
+
+ + @if (file_exists($rev->path() . "/ocr.pdf")) +
+
+
+
+
+
+
+ + OCR Version + +
+
+ {{ format_size(stat($rev->path() . "/ocr.pdf")["size"]) }} +
+
+ + @endif +
+
+ +
+
diff --git a/views/thumbnail_title.blade.php b/views/thumbnail_title.blade.php new file mode 100644 index 0000000..83ec3d2 --- /dev/null +++ b/views/thumbnail_title.blade.php @@ -0,0 +1,84 @@ +@php + $rev->load("document"); +@endphp +
+ + + +
+
+ + @if (($rev->revno != "") && ($rev->revno != "0")) +
+ {{ $rev->document->internal_id }}-{{ $rev->revno }} +
+ @else +
+ {{ $rev->document->internal_id }} +
+ @endif + +
{{ $rev->document->title }}
+ + @if ($rev->document->subtitle) +
{{ $rev->document->subtitle }}
+ @endif + + @if ($rev->document->subsubtitle) +
{{ $rev->document->subsubtitle }}
+ @endif +
+ + +
+
+
+ + {{ fmt_date($rev->month, $rev->year) }} + +
+
+ {{ $rev->info->Pages }} pages +
+
+
+
+ + Original + +
+
+ {{ format_size(stat($rev->path() . "/doc.pdf")["size"]) }} +
+
+ + @if (file_exists($rev->path() . "/ocr.pdf")) +
+
+ + OCR Version + +
+
+ {{ format_size(stat($rev->path() . "/ocr.pdf")["size"]) }} +
+
+ + @endif +
+
+
diff --git a/views/upload/attachment.blade.php b/views/upload/attachment.blade.php new file mode 100644 index 0000000..dbc6041 --- /dev/null +++ b/views/upload/attachment.blade.php @@ -0,0 +1,20 @@ +@extends("layout.main") +@section("content") + +
+
+
+ +
+ +
+ +
+
+
+
+ +@endsection diff --git a/views/upload/document.blade.php b/views/upload/document.blade.php new file mode 100644 index 0000000..c6b8c91 --- /dev/null +++ b/views/upload/document.blade.php @@ -0,0 +1,20 @@ +@extends("layout.main") +@section("content") + +
+
+
+ +
+ +
+ +
+
+
+
+ +@endsection diff --git a/views/upload/duplicate.blade.php b/views/upload/duplicate.blade.php new file mode 100644 index 0000000..865e63f --- /dev/null +++ b/views/upload/duplicate.blade.php @@ -0,0 +1,8 @@ +@extends("layout.main") +@section("content") + +

Duplicate file detected.

+ +Click here to view original + +@endsection diff --git a/views/upload/list.blade.php b/views/upload/list.blade.php new file mode 100644 index 0000000..acc559f --- /dev/null +++ b/views/upload/list.blade.php @@ -0,0 +1,78 @@ +@extends("layout.main") +@section("content") +
+ +@foreach ($uploads as $upload) +
+
+ {{ $upload->filename }} ({{ round($upload->getPDF()->size() / 1024 / 1024 * 100) / 100}} MB) +
+
+ AI: {{ $upload->ai }} + OCR: {{ $upload->ocr }} +
+
+
+
+@if ($upload->ai == 'Y') +

{{ $upload->ai_docid }} {{ $upload->title }} {{ $upload->subtitle }} {{ $upload->subsubtitle }}

+@endif +
+
+
+
+ +@if ($upload->ai == 'Y') +
+
+ {{ $upload->overview }} +
+
+@endif + +
+
+
+ @if (($upload->ai == 'Y') && ($upload->ocr == 'Y')) + @if ($upload->ocr_docid) + Import
{{ $upload->ocr_docid }}
+ @endif + @if ($upload->ai_docid) + Import
{{ $upload->ai_docid }}
+ @endif + + Import
No Code
+ @endif + @if (($upload->ai == "F") || ($upload->ocr == "F")) + Import
Regardless
+ Reprocess + @endif + Discard +
+
+
+ + + + +
+@endforeach + +
+
+
+ @if ($page > 0) + < Prev + @else + < Prev + @endif + Next > +
+
+
+ +
+
+ +
+@endsection diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..a7b1edf --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,57 @@ +const webpack = require('webpack'); +const path = require('path'); +const { VueLoaderPlugin } = require('vue-loader') + +module.exports = { + + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader' + }, { + test: /\.css$/, + use: ['style-loader', 'css-loader'] + }, { + test: /\.(scss)$/, + use: [ + { + loader: 'style-loader', // inject CSS to page + }, { + loader: 'css-loader', // translates CSS into CommonJS modules + }, { + loader: 'postcss-loader', // Run post css actions + options: { + plugins: function () { // post css plugins, can be exported to postcss.config.js + return [ + require('precss'), + require('autoprefixer') + ]; + } + } + }, { + loader: 'sass-loader' // compiles Sass to CSS + } + ] + }, + ] + }, + mode: 'development', + entry: [ + './src/app.js', + './src/app.css', + ], + output: { + path: path.resolve(__dirname, 'public'), + filename: 'app.js', + }, + plugins: [ + // make sure to include the plugin! + new VueLoaderPlugin(), + new webpack.ProvidePlugin({ + $: 'jquery', + jQuery: 'jquery', + ImageZoom: 'js-image-zoom', + }), + ] +};