Как проанализировать имя базового файла с помощью Script-Fu

StackOverflow https://stackoverflow.com/questions/1386293

  •  21-09-2019
  •  | 
  •  

Вопрос

Использование GIMP 2.6.6 для Mac OS X (под x11), как загружено с gimp.org.

Я пытаюсь автоматизировать скучный ручной процесс с помощью Script-Fu. Мне нужно было анализировать имя файла изображения, чтобы сохранить различные слои в качестве новых файлов, используя суффикс на исходном имени файла.

Мои первоначальные попытки пошли так, но потерпели неудачу, потому что (string-search ...) Похоже, не доступно под 2,6 (изменение в двигателе сценариев?).

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

Затем я попытался использовать эта информация Чтобы проанализировать имя базового файла с помощью Regex, но (re-match-nth ...) тоже не признается.

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

И, вытаскивая значение из вектора, без ошибок, результирующее значение не считается строкой, когда оно передается в (string-append ...).

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

Итак, я думаю, мой вопрос: как бы я проанализировал имя базового файла?

Это было полезно?

Решение

Контекст

GIMP 2.6.6 Windows Vista SP2

Цель

Извлеките базовое имя исходного имени файла без его расширения.

Симптом

Ошибка: Eval: несвязанная переменная: Re-Match-Nth

Возможное предложение

Меню Gimp "Фильтры" > "Script-fu" > "Приставка"

В поле ввода вставьте следующее определение функции Script-FU, а затем нажмите ВОЙТИ ключ:

(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

Чтобы проверить функцию, введите:

(filename-basename "screen.xcf")

Консоль Script-FU отвечает:

"screen"

Другие советы

Не совсем правильное решение:

> (filename-baseName "this.is.a.long.filename.jpg")

"это"

Лучшая реализация:

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

Моя версия разделяет имя файла (f) в части разделиться сепаратором (".". "В данном случае); капли последней части; и снова переосмысливает их сепаратором

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

так

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

а также

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

Большое спасибо, Филколборн за указание «простой» способ сделать это. К сожалению, функция батласта устарела:http://www.gimp.org/docs/script-fu-update.html#deprecated

Вот версия Philcolbourn с предложенной заменой:

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

Как и в GIMP 2.8 "Gimp-Image-Get-uri", должен использоваться для получения имени файла файла файла JPG, но Gimp-Image-Get-Uri обеспечивает полный путь, я использовал эту функцию, чтобы извлечь только имя рис (без суффикса ".jpg"):

(позволять* (
(Моринам (Car (Gimp-Image-Get-Uri Image))))))
(BaseName (Car (Reverse (strBreakup (Car (strbreakup uriname ".")) "/"))))))))))))))
...
)
...
)

Для тех, кто ищет истинную функцию строкости, вот функция, которую я написал для использования в 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 "")
    )
)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top