;;; SPDX-FileCopyrightText: 2021 Li Ian-Xue (b4283) ;;; SPDX-FileCopyrightText: 2025 Evgeny Pisemsky ;;; ;;; SPDX-License-Identifier: GPL-3.0-only (define-module (pastebin data)) (use-modules (srfi srfi-9) (srfi srfi-1) (ice-9 ftw) (ice-9 i18n) (ice-9 regex) (ice-9 textual-ports)) (export pb-entry-id pb-entry-id-valid? pb-entry-text pb-data-open pb-data-close call-with-dir-as-pb-data pb-data-get-top pb-data-new-entry pb-get-file-path) (define-record-type (make-pb-data dir) pb-data? (dir pb-data-dir set-pb-data-dir!)) (define-record-type (make-pb-entry id text) pb-entry? (id pb-entry-id set-pb-entry-id!) (text pb-entry-text set-pb-entry-text!)) (define (pb-entry-id-valid? id) (and (= (string-length id) 5) (string-match "[0-9A-Za-z]{5}" id) #t)) ;; input: dir: string ;; output: (define (pb-data-open dir) (make-pb-data dir)) (define (pb-data-close pb-data) #t) (define (call-with-dir-as-pb-data dir p) (let ((pb-data (pb-data-open dir))) (let ((R (p pb-data))) (pb-data-close pb-data) R))) (define (pb-get-file-path pb-data filename) (string-append (pb-data-dir pb-data) "/" filename)) ;; input: , integer ;; output: list of (define (pb-data-get-top pb-data n) (map (lambda (filename) (make-pb-entry filename (call-with-input-file (pb-get-file-path pb-data filename) (lambda (port) (get-string-all port))))) (let ((file-ls (list-files pb-data))) (reverse (take-right file-ls (min n (length file-ls))))))) ;; input: , text ;; output: (define (pb-data-new-entry pb-data text) (let* ((next-filename (get-next-filename pb-data)) (path (pb-get-file-path pb-data next-filename))) (unless (file-exists? path) (call-with-output-file path (lambda (port) (put-string port text)))) (make-pb-entry next-filename text))) (define (list-files pb-data) (scandir (pb-data-dir pb-data) pb-entry-id-valid? (lambda (s1 s2) (string-localeinteger (string->list str)))) (result '())) (if (null? char-int-ls) (list->string (map integer->char result)) (if add (let* ((hd (car char-int-ls)) (tl (cdr char-int-ls))) (if (= hd #x7A) (A #t tl (cons #x30 result)) (A #f tl (cons (case hd ((#x39) #x41) ((#x5A) #x61) (else (1+ hd))) result)))) (A #f '() (append (reverse char-int-ls) result))))))