Pregunta

El uso de Gimp 2.6.6 para Mac OS X (bajo X11) como descargar desde gimp.org.

Estoy tratando de automatizar un proceso manual aburrido con Script-Fu. Que necesitaba para analizar el nombre de archivo de imagen para guardar apagar varias capas como nuevos archivos mediante un sufijo en el nombre del archivo original.

Mis intentos originales fue así, pero fracasó debido a (string-search ...) no parece estar disponible bajo 2.6 (un cambio en el motor de scripting).

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

A continuación, traté de usar este información omita el nombre del archivo de base utilizando expresiones regulares, pero (re-match-nth ...) no se reconoce tampoco.

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

Y mientras tira el valor de la RAN vector sin error, el valor resultante no se considera una cadena cuando se pasa a (string-append ...).

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

Así que supongo que mi pregunta es, ¿cómo iba a analizar el nombre de archivo base?

¿Fue útil?

Solución

Contexto

GIMP 2.6.6 Windows Vista SP2

Goal

Extraer el nombre base del nombre de archivo original sin su extensión.

Síntoma

  

Error: eval: variable sin asignar:    re-match-enésimo

Posible sugerencia

menú de GIMP " Filtros "> " Script-Fu "> " Consola "

En el cuadro de entrada, pegue el siguiente definición Script-Fu de la función después haga clic en el botón ENTER clave:

(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

Para probar la función, escriba:

(filename-basename "screen.xcf")

La consola de Script-Fu contesta:

"screen"

Otros consejos

No es realmente una solución correcta:

  

> (nombre de archivo nombre base "this.is.a.long.filename.jpg")

     

"este"

Una mejor aplicación:

(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)
  )
 )
)

Mi versión divide el nombre de archivo (f) en partes delimitadas por el separador (en este caso ""); gotas última parte; y vuelve a las combina con separador de nuevo

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

so

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

y

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

Muchas gracias philcolbourn por señalar una manera "simple" para hacer esto. Por desgracia, la función butlast está en desuso: http://www.gimp.org/docs/script-fu-update .html # obsoleta

Esta es la versión de philcolbourn con la propuesta sustitución:

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

Al igual que en Gimp 2.8 "gimp-image-get-uri" tiene que ser utilizado para obtener el nombre de archivo de un archivo JPG, pero gimp-image-get-uri proporciona la ruta completa, que utiliza esta función para extraer sólo el nombre de la pic (sin el sufijo ".jpg"):

(let * (
      (IMAGEN uriname (coche (gimp-image-get-URI)))
      (Nombre base (coche (inversa (strbreakup (coche (uriname strbreakup "")) "/"))))
      ...
      )
...
)

Para aquellos que buscan una verdadera funcionalidad cadena de reemplazo, aquí es una función que escribí para su uso en 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 "")
    )
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top