Итерация через каталог с Муравьем

Скажем, у меня есть набор файлов PDF со следующими путями:

/some/path/pdfs/birds/duck.pdf
/some/path/pdfs/birds/goose.pdf
/some/path/pdfs/insects/fly.pdf
/some/path/pdfs/insects/mosquito.pdf

То, что я хотел бы сделать, генерируют миниатюры для каждого PDF, которые уважают структуру относительного пути и производят к другому местоположению, т.е.:

/another/path/thumbnails/birds/duck.png
/another/path/thumbnails/birds/goose.png
/another/path/thumbnails/insects/fly.png
/another/path/thumbnails/insects/mosquito.png

Я хотел бы, чтобы это было сделано у Муравья. Предположите, что я собираюсь использовать Ghostscript на командной строке, и я уже разработал вызов к GS:

    <exec executable="${ghostscript.executable.name}">
        <arg value="-q"/>
        <arg value="-r72"/>
        <arg value="-sDEVICE=png16m"/>
        <arg value="-sOutputFile=${thumbnail.image.path}"/>
        <arg value="${input.pdf.path}"/>
    </exec>

Таким образом, то, что я должен сделать, разрабатывают правильные значения для ${thumbnail.image.path} и ${input.pdf.path} в то время как пересечение PDF ввело каталог.

У меня есть доступ к муравью-contrib (просто установил "последнее", которое является 1.0b3), и я использую Муравья 1.8.0. Я думаю, что могу заставить что-то работать с помощью <for> задача, <fileset>s и <mapper>s, но я испытываю затруднения при соединении всего этого.

Я попробовал что-то как:

    <for param="file">
        <path>
            <fileset dir="${some.dir.path}/pdfs">
                <include name="**/*.pdf"/>
            </fileset>
        </path>
        <sequential>
            <echo message="@{file}"/>
        </sequential>
    </for>

Но к сожалению @{file} свойство является полным путем, и я не могу найти простой способ разложить его на относительные компоненты.

Если я могу только сделать это использование пользовательской задачи, я предполагаю, что мог бы записать один, но я надеюсь, что могу просто включить вместе существующие компоненты.

6
задан Shaggy Frog 17 May 2010 в 22:00
поделиться

2 ответа

В последовательной задаче вы могли бы использовать задачу ant-contrib propertyregex для сопоставления входных путей с выходными. Например:

<propertyregex override="yes" property="outfile" input="@{file}"
               regexp="/some/path/pdfs/(.*).pdf"
               replace="/another/path/\1.png" />

Которая сопоставляет, например, /some/path/pdfs/birds/duck.pdf с /another/path/birds/duck.png.

6
ответ дан 16 December 2019 в 21:36
поделиться

Для полноты картины вот что я придумал для цели, основываясь на ответе Мартина Клейтона. Пока что он работает только в Windows, но это потому, что я еще не успел установить Ghostscript не прокси на Mac OS X. Обратите внимание, что для кросс-платформенного решения мне пришлось "почистить" разделители файлов, чтобы они были только прямыми косыми чертами.

<target name="make-thumbnails" depends="">
    <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
            <pathelement location="/path/to/ant-contrib-1.0b3.jar"/>
        </classpath>
    </taskdef>

    <condition property="ghostscript.executable.name" value="/path/to/gswin32c.exe">
        <os family="windows"/>
    </condition>
    <condition property="ghostscript.executable.name" value="">
        <os family="mac"/>
    </condition>

    <for param="file">
        <path>
            <fileset dir="/path/to/pdfs">
                <include name="**/*.pdf"/>
            </fileset>
        </path>
        <sequential>
            <propertyregex override="yes" property="file-scrubbed" input="@{file}"
                                regexp="\\"
                                replace="/" />
            <propertyregex override="yes" property="output-path-directory-fragment" input="${file-scrubbed}"
                                regexp=".*/pdfs/(.*)/.+\.pdf"
                                replace="\1" />
            <propertyregex override="yes" property="output-path-file-fragment" input="${file-scrubbed}"
                                regexp=".*/pdfs.*/(.+)\.pdf"
                                replace="\1.png" />
            <mkdir dir="${thumbnails.base.dir}/${output-path-directory-fragment}"/>
            <exec executable="${ghostscript.executable.name}">
                <arg value="-q"/>
                <arg value="-dLastPage=1"/>
                <arg value="-dNOPAUSE"/>
                <arg value="-dBATCH"/>
                <arg value="-dSAFER"/>
                <arg value="-r72"/>
                <arg value="-sDEVICE=png16m"/>
                <arg value="-sOutputFile=${thumbnails.base.dir}/${output-path-directory-fragment}/${output-path-file-fragment}"/>
                <arg value="${file-scrubbed}"/>
            </exec>
        </sequential>
    </for>
</target>
2
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: