diff --git a/data/error-pages/51 b/data/error-pages/51 new file mode 100644 index 0000000..c636147 --- /dev/null +++ b/data/error-pages/51 @@ -0,0 +1,8 @@ +# Error! + +### {url} +### not found + +### Server replied: + +### {meta} diff --git a/data/icons/fmw_text.png b/data/icons/fmw_text.png new file mode 100644 index 0000000..e5be01e Binary files /dev/null and b/data/icons/fmw_text.png differ diff --git a/src/gui/server/public-api-gemini-stream.lisp b/src/gui/server/public-api-gemini-stream.lisp index 02799e3..849b892 100644 --- a/src/gui/server/public-api-gemini-stream.lisp +++ b/src/gui/server/public-api-gemini-stream.lisp @@ -518,7 +518,7 @@ (encode-flat-array-of-plists (unbox object) stream)) (defun gemini-parse-string (string) - (let ((parsed-lines (gemini-parser:parse-gemini-file string))) + (let ((parsed-lines (gemini-parser:parse-gemini-file string :initialize-parser t))) (make-instance 'parsed-lines-slice :contents (rearrange-parsed-line-for-encoding parsed-lines)))) @@ -530,19 +530,40 @@ (defun gemini-slurp-local-file (path) (fs:slurp-file path)) +(a:define-constant +error-pages-path+ "/data/error-pages" :test #'string=) + +(a:define-constant +error-template-url-placeholder+ "{url}" :test #'string=) + +(a:define-constant +error-template-meta-placeholder+ "{meta}" :test #'string=) + +(defun construct-error-page (iri code meta) + (ignore-errors + (a:when-let* ((file-path (res:get-data-file (fs:cat-parent-dir +error-pages-path+ + (to-s code)))) + (template (fs:slurp-file file-path))) + (setf template (cl-ppcre:regex-replace-all +error-template-url-placeholder+ + template + iri)) + (setf template (cl-ppcre:regex-replace-all +error-template-meta-placeholder+ + template + meta))))) + (defun make-error-page (iri code description meta) - (let* ((separator (make-string 10 :initial-element gemini-parser::+h2-underline+)) - (gemtext (with-output-to-string (stream) - (write-sequence (gemini-parser:geminize-h2 (format nil - "~a ~a~%" - code - description)) - stream) - (write-sequence (gemini-parser:geminize-preformatted separator) - stream) - (write-sequence (format nil "Error connecting to: ~a:~2%" iri) stream) - (write-sequence (format nil "~a~%" meta) stream)))) - (gemini-parse-string gemtext))) + (let ((error-gemtext (construct-error-page iri code meta))) + (if error-gemtext + (gemini-parse-string error-gemtext) + (let* ((separator (make-string 10 :initial-element gemini-parser::+h2-underline+)) + (gemtext (with-output-to-string (stream) + (write-sequence (gemini-parser:geminize-h2 (format nil + "~a ~a~%" + code + description)) + stream) + (write-sequence (gemini-parser:geminize-preformatted separator) + stream) + (write-sequence (format nil "Error connecting to: ~a:~2%" iri) stream) + (write-sequence (format nil "~a~%" meta) stream)))) + (gemini-parse-string gemtext))))) (defun gemini-save-url-db-history (iri) (db:insert-in-history (ui:open-url-prompt) iri))