我正在编写GIMP脚本以将图层导出到文件。我想提供一个用户可指定的字段,它们可以提供要导出的文件名的格式,每个元素使用波浪号 - 字符组合(即名为“foo”的文件,其中包含“bar”和“baz”图层,输出文件名格式为“~f-~l.png”,输出“foo-bar.png”和“foo-baz.png”)。我知道如何在Lua中做到这一点:
local nameformat = "~f-~l.png"
local function layer_export_name(filename, layername)
return string.gsub(nameformat, '~.', {f=filename, l=layername})
end
我如何在GIMP计划中这样做?
重申:我需要替换字符串中的关键字。我不需要一个创建我已定义的字符串的函数。
答案 0 :(得分:4)
没有标准的Scheme程序来执行此操作。我写了以下有效但便携的程序:
(define (expand-keywords string tokens)
(let loop ((slist (string->list string))
(in-replace-mode #f)
(result ""))
(if (not (null? slist))
(let ((c (car slist)))
(cond (in-replace-mode
(let ((token (car (cdr (assoc c tokens)))))
(loop (cdr slist) #f (string-append result token))))
((char=? c #\~)
(loop (cdr slist) #t result))
(else
(loop (cdr slist) #f (string-append result
(make-string 1 c))))))
result)))
样本用法:
> (expand-keywords "~f-~l.png" '((#\f "vijay") (#\l "9")))
"vijay-9.png"
> (expand-keywords "~f-~l.~e" '((#\f "vijay") (#\l "10") (#\e "jpg")))
"vijay-10.jpg"
如果您的Scheme实现提供了一个就地修改字符串的过程,请使用该过程而不是string-append
。
答案 1 :(得分:0)
BIG CAVEAT:我知道很多Scheme,但没有很多GIMP计划 - 显然是TinyScheme。例如,在Racket中,你会写
(format "~a-~a.png" filename layername)
...假设layername是一个字符串(我的问题不清楚是否是这种情况)。
我猜你在TinyScheme中没有球拍的“格式”,但你几乎肯定有“字符串附加”:
(string-append filename "-" layername ".png")
如果layername是一个字符串,你可能还想使用number->字符串函数,如下所示:
(string-append filename "-" (number->string layername) ".png")