# Aap recipe for Dutch Vim spell files.

# Use a freshly compiled Vim if it exists.
@if os.path.exists('../../../src/vim'):
    VIM = ../../../src/vim
@else:
    :progsearch VIM vim

SPELLDIR = ..
FILES    = nn_NO.aff nn_NO.dic

all: $SPELLDIR/nn.latin1.spl $SPELLDIR/nn.utf-8.spl ../README_nn.txt

$SPELLDIR/nn.latin1.spl : $FILES
        :sys env LANG=no_NO.ISO8859-1
		$VIM -u NONE -e -c "mkspell! $SPELLDIR/nn nn_NO" -c q

$SPELLDIR/nn.utf-8.spl : $FILES
        :sys env LANG=no_NO.UTF-8
		$VIM -u NONE -e -c "mkspell! $SPELLDIR/nn nn_NO" -c q

../README_nn.txt : README_nn_NO.txt
        :copy $source $target

#
# Fetching the files from OpenOffice.org.
#
OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
:attr {fetch = $OODIR/%file%} nn_NO.zip

# The files don't depend on the .zip file so that we can delete it.
# Only download the zip file if the targets don't exist.
nn_NO.aff nn_NO.dic: {buildcheck=}
        :assertpkg unzip patch
        :fetch nn_NO.zip
        :sys $UNZIP nn_NO.zip
        :delete nn_NO.zip
        @if not os.path.exists('nn_NO.orig.aff'):
            :copy nn_NO.aff nn_NO.orig.aff
        @if not os.path.exists('nn_NO.orig.dic'):
            :copy nn_NO.dic nn_NO.orig.dic
        @if os.path.exists('nn_NO.diff'):
            :sys patch <nn_NO.diff


# Generate diff files, so that others can get the OpenOffice files and apply
# the diffs to get the Vim versions.

diff:
        :assertpkg diff
        :sys {force} diff -a -C 1 nn_NO.orig.aff nn_NO.aff >nn_NO.diff
        :sys {force} diff -a -C 1 nn_NO.orig.dic nn_NO.dic >>nn_NO.diff


# Check for updated OpenOffice spell files.  When there are changes the
# ".new.aff" and ".new.dic" files are left behind for manual inspection.

check:
        :assertpkg unzip diff
        :fetch nn_NO.zip
        :mkdir tmp
        :cd tmp
        @try:
            @import stat
            :sys $UNZIP ../nn_NO.zip
            :sys {force} diff ../nn_NO.orig.aff nn_NO.aff >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy nn_NO.aff ../nn_NO.new.aff
            :sys {force} diff ../nn_NO.orig.dic nn_NO.dic >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy nn_NO.dic ../nn_NO.new.dic
        @finally:
            :cd ..
            :delete {r}{f}{q} tmp
            :delete nn_NO.zip


# vim: set sts=4 sw=4 :
