# Aap recipe for Hebrew 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    = he_IL.aff he_IL.dic

all: $SPELLDIR/he.utf-8.spl $SPELLDIR/he.iso-8859-8.spl ../README_he.txt

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

$SPELLDIR/he.iso-8859-8.spl : $FILES
        :sys $VIM -u NONE -e -c "set enc=iso-8859-8"
                        -c "mkspell! $SPELLDIR/he he_IL" -c q

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


# vim: set sts=4 sw=4 :
