;; file KLEIDER/web/src/lockal/process-dir.scm ;; Bilddateien in Verzeichnissen verarbeiten ;; Herbert Schiemann ;; 2019-02-19 ;; 2021-07-14 FILE-TYPE-LINK zulassen ;; 2022-04-17 Nur Bilddateien mit Suffix ".jpg" ;; Zeichenkette am letzten Vorkommen des Zeichens zerlegen ;; (de-herbaer-string-split-at-last "auto.bahn.bau.stelle" #\.) ;; ergibt ;; '("auto.bahn.bau" ".stelle") (define (de-herbaer-split-string-at-last str chr) (let ((a -1) (l (string-length str))) (do ((c 0 (+ c 1))) ((= c l) (and (= a -1) (set! a l)) (list (substring str 0 a) (substring str a l))) (and (char=? chr (string-ref str c)) (set! a c)))) ) ; de-herbaer-split-string-at-last ;; (de-herbaer-set-suffix "auto.whisky" ".note" 7) ;; ergibt "auto.note" ;; (de-herbaer-set-suffix "auto.whisky" ".note" 3) ;; ergibt "auto.whisky.note" ;; sfx muss ein String mit einer Länge > 0 sein. (define (de-herbaer-set-suffix name sfx max-sfxlen) (let* ((sp (de-herbaer-split-string-at-last name (string-ref sfx 0))) (base (car sp)) (ext (cadr sp))) (if (and (< 0 (string-length base)) (<= (string-length ext) max-sfxlen)) (string-append base sfx) (string-append name sfx))) ) ; de-herbaer-set-suffix ;; Die Datei "de_herbaer_process_dir" speichert Daten im Zusammenhang ;; der Verarbeitung eines Verzeichnisses. ;; Der Wert ist (), wenn die Verarbeitung eines Verzeichnisses abgeschlossen ist ;; und eine Verarbeitung eines Verzeichnisses nicht neu begonnen hat. ;; Sonst ist der Wert folgender: ;; ( ;; imgfunc ; Funktion zum Öffnen / Schließen eines Bilder ;; image ; das "laufende" Bild ;; display ; die ID der Anzeige des laufenden Bildes ;; dir-in ; der Pfad des Eingabe-Verzeichnisses ;; dir-out ; der Pfad des Ausgabe-Verzeichnisses ;; ( ;; image-file-1 ; Dateiname einer Bilddatei in dir-in ;; ... ;; ) ;; ) (define (de-herbaer-process-dir dir-in dir-out replace imgfunc) (let* ((dh (dir-open-stream dir-in)) (files ())) (do ((de (dir-read-entry dh) (dir-read-entry dh))) ((eof-object? de) (dir-close-stream dh)) (if (and (or (= FILE-TYPE-FILE (file-type (string-append dir-in DIR-SEPARATOR de))) (= FILE-TYPE-LINK (file-type (string-append dir-in DIR-SEPARATOR de)))) (string=? (cadr (de-herbaer-split-string-at-last de #\.)) ".jpg") (or replace (not (file-exists? (string-append dir-out DIR-SEPARATOR de))))) (set! files (cons de files)))) (call-with-output-file (string-append gimp-dir DIR-SEPARATOR "de_herbaer_process_dir") (lambda (p) (write (list imgfunc -1 ; image -1 ; display dir-in dir-out files) p)))) (script-fu-de-herbaer-process-dir) ) ; de-herbaer-process-dir (define (script-fu-de-herbaer-process-dir) (let ( (ps ()) (datafile (string-append gimp-dir DIR-SEPARATOR "de_herbaer_process_dir")) ) (call-with-input-file datafile (lambda (p) (set! ps (read p)))) (if (null? ps) () (let* ((imgfunc (car ps)) (img (begin (set! ps (cdr ps)) (car ps))) (dsp (begin (set! ps (cdr ps)) (car ps))) (dir-in (begin (set! ps (cdr ps)) (car ps))) (dir-out (begin (set! ps (cdr ps)) (car ps))) (files (begin (set! ps (cdr ps)) (car ps)))) ;; offene Datei schließen (if (and (= TRUE (car (gimp-display-is-valid dsp))) (= TRUE (car (gimp-image-is-valid img)))) (let* ((name (car (gimp-image-get-name img))) (path (string-append dir-out DIR-SEPARATOR name)) (res ((eval imgfunc) img 1)) (save (car res)) (note (cadr res))) (if save (let ((layer (vector-ref (cadr (gimp-image-get-layers img)) 0))) (gimp-file-save RUN-NONINTERACTIVE img layer path name))) (cond ((not note)) ((null? note)) ((equal? note "")) ((string? note) (call-with-output-file (string-append dir-out DIR-SEPARATOR (de-herbaer-set-suffix name ".note" 5)) (lambda (port) (display note port)))) (else (call-with-output-file (string-append dir-out DIR-SEPARATOR (de-herbaer-set-suffix name ".scm" 5)) (lambda (port) (write note port))))) (gimp-display-delete dsp) (set! files (cdr files)))) ;; neue Bild-Datei öffnen (if (null? files) (call-with-output-file datafile (lambda (p) (write () p))) (let* ((file (car files)) (img (car (gimp-file-load RUN-NONINTERACTIVE (string-append dir-in DIR-SEPARATOR file) file))) (dsp (car (gimp-display-new img)))) (gimp-image-clean-all img) (call-with-output-file datafile (lambda (p) (write (list imgfunc img dsp dir-in dir-out files) p))) (if ((eval imgfunc) img 0) (script-fu-de-herbaer-process-dir))))))) ) ; script-fu-de-herbaer-process-dir (script-fu-register "script-fu-de-herbaer-process-dir" _"Weiter" _"Nächstes Bild" "Herbert Schiemann" "(C) 2019 Herbert Schiemann, GPL 2" "2019-01-10" "" ) (script-fu-menu-register "script-fu-de-herbaer-process-dir" "/_Filters/Verzeichnis") ;; end of file KLEIDER/web/src/lockal/process-dir.scm