Question

Utilisation 2.6.6 pour MAC Gimp OS X (X11) comme téléchargé à partir gimp.org.

Je suis en train d'automatiser un processus manuel ennuyeux avec Script-Fu. Je avais besoin pour analyser le nom du fichier d'image pour enregistrer de différentes couches que de nouveaux fichiers en utilisant un suffixe sur le nom du fichier d'origine.

Mes tentatives originales sont allés comme ça, mais a échoué parce (string-search ...) ne semble pas être disponible sous 2.6 (une modification du moteur de script?).

(set! basefilename (substring filename 0 (string-search "." filename))) 

Alors j'ai essayé d'utiliser ce informations pour analyser le nom du fichier de base en utilisant regex mais (re-match-nth ...) ne reconnaît pas non plus.

(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
    (set! basefilename (re-match-nth orig-name buffer 1))
    )

Et tout en tirant la valeur hors du vecteur couru sans erreur, la valeur résultante est pas considérée comme une chaîne quand il est passé dans (string-append ...).

(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
    (set! basefilename (vector-ref buffer 1))
    ) 

Je suppose que ma question est, comment pourrais-je analyser le nom du fichier de base?

Était-ce utile?

La solution

Contexte

GIMP 2.6.6 Windows Vista SP2

Objectif

Extraire le nom de base du nom de fichier d'origine sans son extension.

Symptôme

  

Erreur: eval: Variable non lié:   -n-ième re-match

suggestion possible

Menu GIMP " Filtres "> " Script-Fu "> " Console "

Dans la zone d'entrée, collez la définition suivante Script-Fu de la fonction puis appuyez sur la ENTRER touche:

(define (filename-basename orig-name)
    (car (strbreakup orig-name "."))
    ; Nimmzo 09/09/30: the string split function strbreakup is defined 
    ; in the compatibility file from SIOD to TinyScheme:
    ; C:\Program Files\GIMP\share\gimp\2.0\scripts\script-fu-compat.init
) ; end  filename-basename

Pour tester la fonction, entrez:

(filename-basename "screen.xcf")

Les réponses Script-Fu Console:

"screen"

Autres conseils

Pas vraiment une solution correcte:

  

> (nom de fichier-basename "this.is.a.long.filename.jpg")

     

"ce"

Une meilleure mise en œuvre:

(define (morph-filename orig-name new-extension)
 (let* ((buffer (vector "" "" "")))
  (if (re-match "^(.*)[.]([^.]+)$" orig-name buffer)
   (string-append (substring orig-name 0 (car (vector-ref buffer 2))) new-extension)
  )
 )
)

Ma version divise le nom de fichier (f) dans des parties délimitées par le séparateur (dans ce cas « »); gouttes dernière partie; et les re-combine avec séparateur à nouveau

(define (pc-drop-extension f) 
  (unbreakupstr (butlast (strbreakup f ".")) ".")  )

(pc-drop-extension "ab.cd.efi") -> "ab.cd"

et

(pc-drop-extension "ab/cd.ef/ghi.jkl.mno") -> "ab/cd.ef/ghi.jkl"

Un grand merci philcolbourn d'avoir signalé un moyen « simple » de le faire. Malheureusement, la fonction butlast est dépréciée: http://www.gimp.org/docs/script-fu-update .html # dépréciée

Voici la version de philcolbourn avec le remplacement suggéré:

(define (drop-extension filename)
  (unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)

Comme dans Gimp 2.8 « gimp-image-get-uri » doit être utilisé pour obtenir le nom d'un fichier JPG, mais gimp-image-get-uri délivre le chemin complet, j'ai utilisé cette fonction pour extraire tout le nom de l'image (sans le suffixe ".jpg"):

(let * (
      (Uriname (voiture (gimp-image-get-uri IMAGE)))
      (Basename (voiture (inverse (strbreakup (voiture (strbreakup uriname "")) "/"))))
      ...
      )
...
)

Pour ceux qui recherchent une véritable fonctionnalité de chaîne de remplacement, voici une fonction que j'ai écrit pour une utilisation dans Script Fu

(define (string-replace strIn strReplace strReplaceWith)
    (let*
        (
            (curIndex 0)
            (replaceLen (string-length strReplace))
            (replaceWithLen (string-length strReplaceWith))
            (inLen (string-length strIn))
            (result strIn)
        )
        ;loop through the main string searching for the substring
        (while (<= (+ curIndex replaceLen) inLen)
            ;check to see if the substring is a match
            (if (substring-equal? strReplace result curIndex (+ curIndex replaceLen))
                (begin
                    ;create the result string
                    (set! result (string-append (substring result 0 curIndex) strReplaceWith (substring result (+ curIndex replaceLen) inLen)))
                    ;now set the current index to the end of the replacement. it will get incremented below so take 1 away so we don't miss anything
                    (set! curIndex (-(+ curIndex replaceWithLen) 1))
                    ;set new length for inLen so we can accurately grab what we need
                    (set! inLen (string-length result))
                )
            )
            (set! curIndex (+ curIndex 1))
        )
       (string-append result "")
    )
)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top