Alle Dateinamen in einem Verzeichnis in ein Markup einbauen

Begonnen von Manuela, Samstag, 22. Dezember 2018, 10:04

« vorheriges - nächstes »

Manuela

Hi,

es gibt eine Funktion (die in diesem Forum entwickelt wurde), die alle ly-Dateien in einem Verzeichnis inkludiert.

loadFilesr =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "ly" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 (ly:parser-include-string
                  (string-append
                   "\\include \"" dir-name "/" entry "\"")))
       files)))


Jetzt möchte ich alle Dateien in einem Verzeichnis (in diesem Fall eps-Dateien) in ein Markup einbauen, sodass pro Datei eine Seite ausgegeben wird.

\bookpart {
  \markup \column {
    {
      \fill-line {
        \null \epsfile #X #80 #"xxx.eps" \null
      }
    }
  }
}


Dort wo xxx.eps stehen, sollen die EPS-Dateien aus dem Verzeichnis eingesetzt werden, für jede EPS-Datei ein bookpart ausgegeben werden. Meine Bitte an die Scheme Spezialisten, eine passende Funktion zu schreiben. Für mich wäre das vermutlich stundenlanger Aufwand, bis ich dahinter komme.

Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

Ich habe mal einen ersten Entwurf gebastelt, der den Nachteil hat, keinerlei Ausgabe zu liefern, aber auch keine Fehlermeldung.
\version "2.19.80"

loadFilesr =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 #{
                   \bookpart {
                      \markup \column {
                       {
                         \vspace #-4
                         \fill-line {
                           \null
                           \epsfile #X #80 $entry \null
                         }
                       }
                     }
                   }
                 #}
                 )
       files)))

\loadFilesr "eps1"


Im Unterverzeichns eps1 stehen die eps-Dateien.
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

Inzwischen habe die Funktion "verbessert", sodass jetzt eine Fehlermeldung ausgegeben wird
\version "2.19.80"

loadFilesr =
#(define-music-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 #{
                   \bookpart {
                     \paper {
                       evenHeaderMarkup = ##f
                       oddHeaderMarkup = ##f
                     }
                     \markup \column {
                       {
                         \vspace #-4
                         \fill-line {
                           \null \epsfile #X #80 #(string-append entry ".eps") \null
                         }
                       }
                     }
                   }
                 #}
                 )
       files)))

\loadFilesr "eps1"


Fehlermeldung:

»V:/Lilypond/titelinclude1.ly« wird verarbeitet
Analysieren...
V:/Lilypond/titelinclude1.ly:33:1: Fehler: music-Funktion kann nicht ##<unspecified>

ausgeben

\loadFilesr "eps1"
schwerer Fehler: gescheiterte Dateien: "V:/Lilypond/titelinclude1.ly"
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

Hallo Manuela,

hier das Beste was ich Dir bieten kann:


\version "2.19.82"

#(define (proc dir-name)
   (let ((dir (opendir dir-name))
         (eps-files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! eps-files (append (list entry) eps-files))))
     (closedir dir)
     (map
        (lambda (arg) #{ \bookpart { \markup \epsfile #X #80 $arg } #})
        eps-files)))

$@(proc "/path/to/folder")


\bookpart is sowas von buggy ...

Ich kann nicht zählen wie oft ich heute schon diesen (oder einen sehr ähnlichen) error gesehen habe:
Zitat
lilypond: /home/gub/NewGub/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypond.git-stable-2.20/lily/book.cc:258: void Book::process_score(SCM, Paper_book*, Output_def*): Assertion `0' failed.
Aborted (core dumped)

Aargh !!

Gruß,
  Harm

Manuela

Vielen Dank, Harm, genau so etwas habe ich gesucht. Ich habe inzwischen ein wenig weiter recheriert und habe herausgefunden, dass bookpart nicht ganz richtig funktioniert. Umso glücklicher bin ich mit deiner Funktion,
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

Ich habe diese Funktion reaktiviert und eine Überraschung erlebt. Die letzte Datei im Verzeichnis wird nicht ausgegeben, und für manche Dateien wird eine Fehlermeldung ausgegeben
schwerer Fehler: Datei »xyz.eps« kann nicht gefunden werden
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

Hallo Manuela,

es sollte funktionieren.

Kannst Du mal folgendes versuchen:


#(define (proc dir-name)
   (let ((dir (opendir dir-name))
         (eps-files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! eps-files (append (list entry) eps-files))))
     (closedir dir)
     (format #t
       "~a contains ~a eps-files:\n~y"
       dir-name
       (length eps-files)
       (sort eps-files string-ci<))
     (map
        (lambda (arg) #{ \bookpart { \markup \epsfile #X #80 $arg } #})
        (sort eps-files string-ci<))))

$@(proc "/path/to/folder")


Es wird dann angezeigt wieviele .eps-files in welchem Ordner gefunden werden und welche.
Diese werden dann alle in bookparts gepackt und ausgegeben.
Neben dem initiierten terminal-output habe ich die eps-files vor der Ausgabe alphabetisch geordnet.

Funktioniert bei mir.

Gruß,
  Harm