# 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    = nb_NO.aff nb_NO.dic

all: $SPELLDIR/nb.latin1.spl $SPELLDIR/nb.utf-8.spl ../README_nb.txt

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

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

../README_nb.txt : README_nb_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%} nb_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.
nb_NO.aff nb_NO.dic: {buildcheck=}
        :assertpkg unzip patch
        :fetch nb_NO.zip
        :sys $UNZIP nb_NO.zip
        :delete nb_NO.zip
        @if not os.path.exists('nb_NO.orig.aff'):
            :copy nb_NO.aff nb_NO.orig.aff
        @if not os.path.exists('nb_NO.orig.dic'):
            :copy nb_NO.dic nb_NO.orig.dic
        @if os.path.exists('nb_NO.diff'):
            :sys patch <nb_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 nb_NO.orig.aff nb_NO.aff >nb_NO.diff
        :sys {force} diff -a -C 1 nb_NO.orig.dic nb_NO.dic >>nb_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 nb_NO.zip
        :mkdir tmp
        :cd tmp
        @try:
            @import stat
            :sys $UNZIP ../nb_NO.zip
            :sys {force} diff ../nb_NO.orig.aff nb_NO.aff >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy nb_NO.aff ../nb_NO.new.aff
            :sys {force} diff ../nb_NO.orig.dic nb_NO.dic >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy nb_NO.dic ../nb_NO.new.dic
        @finally:
            :cd ..
            :delete {r}{f}{q} tmp
            :delete nb_NO.zip


# vim: set sts=4 sw=4 :
