使用如从gimp.org下载的MAC OS X(X11下)芯线2.6.6。
我试图用自动化脚本富枯燥的手工工艺。 我需要解析图像文件名使用原始文件名的后缀,以节省掉各层为新文件。
我最初的尝试是这样进行的,但失败了,因为(string-search ...)
似乎并不为2.6下可用(更改脚本引擎?)。
(set! basefilename (substring filename 0 (string-search "." filename)))
然后,我试图用这个信息来解析出使用正则表达式,但基本文件名(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:未绑定变量: 重新匹配n次
可能的建议
GIMP菜单“ 滤镜 ”>“ 脚本福 ”>“ 控制台 ”
在输入框中粘贴的功能,下面的脚本富定义,然后按Enter键:
(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")
脚本富控制台的答案:
"screen"
不是一个真正的正确的解决方案:
>(文件名-基名 “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"
非常感谢philcolbourn您指出一个“简单”的方式来做到这一点。 不幸的是,butlast功能弃用: 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图像-GET-URI”必须使用得到一个JPG文件的文件名,但GIMP图像-GET-URI提供完整的路径,我用这个函数抽取的只是名字PIC(不带后缀名 “.jpg”):
(让*(
(uriname(汽车(GIMP图像-GET-URI IMAGE)))
(基名(轿厢(反向(strbreakup(轿厢(strbreakup uriname “”)) “/”))))
...
)
...
)
对于那些寻找一个真正的字符串替换功能,这里是我的脚本傅使用写了一个函数
(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 "")
)
)